2010-04-12 6 views
9

मेरे पास एक प्रबंधित क्लास लाइब्रेरी है (mylib.dll कहें) और एक तृतीय पक्ष प्रबंधित ऐप (app.exe कहें) जो mylib.dll का उपयोग कर रहा है। मेरे पास mylib.dll का कोड है लेकिन app.exe का नहीं है। तो वर्तमान में मैं क्या करता हूं मैं mylib.dll बना रहा हूं, इसे app.exe की निर्देशिका में कॉपी करें, app.exe शुरू करें और प्रक्रिया से संलग्न करें। इस तरह अगर मैं कोड mylib.dll में ब्रेकपॉइंट डालता हूं, तो मुझे लगता है कि उन्हें हिट किया जा रहा है। लेकिन जब भी कोई बाहरी एप्लिकेशन अपनी उजागर विधियों में से किसी एक को कॉल करता है तो mylib.dll के कोड में स्वचालित रूप से तोड़ने के लिए वैसे भी है? अर्थात। केवल डीएल के प्रवेश बिंदुओं के लिए।क्या मेरी कक्षा लाइब्रेरी फ़ंक्शंस कॉल होने पर स्वचालित रूप से डीबगर में तोड़ने का कोई तरीका है?

धन्यवाद, मिशाल

उत्तर

7

तहत परियोजना -> गुण -> डीबग -> प्रारंभ कार्रवाई आप बाहरी कार्यक्रम प्रारंभ करें और अपनी app.exe का पथ दर्ज करें विकल्प निर्दिष्ट करना चाहिए। यह संलग्न डीबगर के साथ app.exe लॉन्च करना चाहिए।

भी देखें How to: Change the Start Action for Application Debugging

अपडेट: दृश्य स्टूडियो में ब्रेकप्वाइंट या तो एक निश्चित स्थान (एक स्रोत फ़ाइल में कोड की अर्थात एक विशिष्ट लाइन) या एक समारोह नाम के लिए बाध्य कर रहे हैं। इसलिए मूल रूप से आपके असेंबली में किसी फ़ंक्शन को तोड़ने के लिए दो विकल्प होते हैं: या तो सभी फ़ंक्शन घोषणाओं पर या सभी फ़ंक्शन नामों पर ब्रेकपॉइंट्स डालें (डीबग -> नया ब्रेकपॉइंट -> फ़ंक्शन नाम पर ब्रेक करें)। दुर्भाग्य से, बाद वाले विकल्प को पूर्ण फ़ंक्शन नाम की आवश्यकता होती है और वाइल्डकार्ड की अनुमति नहीं देती है।

आपके अन्य लाइब्रेरी फ़ंक्शंस की शुरुआत में Debug.Assert(false) स्थान पर रखने का एक और विकल्प है।

फिर भी एक और विकल्प विजुअल स्टूडियो मैक्रो का उपयोग करना होगा। अपने कोड डोम से अधिक दोहराता नीचे मैक्रो और सभी सार्वजनिक तरीकों और गुण के लिए एक ब्रेकपाइंट जोड़ता है:

Option Strict Off 
Option Explicit Off 
Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports System.Diagnostics 
Imports System.Windows.Forms 

Public Module Breakpoints 

    Sub AddBreakpointsToAllFunctionsAndProperties() 
     Try 
      If DTE.ActiveSolutionProjects.Length <> 1 Then 
       MsgBox("Select one project within the Solution Explorer, then re-run this macro.") 
       Exit Sub 
      End If 

      AddBreakpointsToProject(DTE.ActiveSolutionProjects(0)) 
     Catch ex As System.Exception 
      MessageBox.Show(ex.ToString) 
     End Try 
    End Sub 

    Private Sub AddBreakpointsToProject(ByVal proj As Project) 
     For i As Integer = 1 To proj.ProjectItems.Count 
      If Not proj.ProjectItems.Item(i).FileCodeModel Is Nothing Then 
       AddBreakpointsToProjectItems(proj.ProjectItems.Item(i).FileCodeModel.CodeElements) 
      End If 
     Next 
    End Sub 


    Private Sub AddBreakpointsToProjectItems(ByVal colCodeElements As CodeElements) 
     Dim objCodeElement As EnvDTE.CodeElement 

     If Not (colCodeElements Is Nothing) Then 
      For Each objCodeElement In colCodeElements 
       AddBreakpointsToProjectItem(objCodeElement) 
      Next 
     End If 
    End Sub 

    Private Sub AddBreakpointsToProjectItem(ByVal objCodeElement As CodeElement) 

     Dim objCodeNamespace As EnvDTE.CodeNamespace 
     Dim objCodeType As EnvDTE.CodeType 
     Dim objCodeFunction As EnvDTE.CodeFunction 
     Dim objCodeProperty As EnvDTE.CodeProperty 

     Try 
      'MessageBox.Show(objCodeElement.FullName & " (Kind: " & objCodeElement.Kind.ToString & ")") 

      If objCodeElement.Kind = vsCMElement.vsCMElementFunction Then 
       objCodeFunction = DirectCast(objCodeElement, EnvDTE.CodeFunction) 
       If objCodeFunction.Access = vsCMAccess.vsCMAccessPublic Then 
        DTE.Debugger.Breakpoints.Add(objCodeElement.FullName) 
       End If 
      ElseIf objCodeElement.Kind = vsCMElement.vsCMElementProperty Then 
       objCodeProperty = DirectCast(objCodeElement, EnvDTE.CodeProperty) 
       DTE.Debugger.Breakpoints.Add(objCodeElement.FullName) 
      End If 
     Catch ex As System.Exception 
      ' Ignore 
     End Try 

     If TypeOf objCodeElement Is EnvDTE.CodeNamespace Then 
      objCodeNamespace = CType(objCodeElement, EnvDTE.CodeNamespace) 
      AddBreakpointsToProjectItems(objCodeNamespace.Members) 
     ElseIf TypeOf objCodeElement Is EnvDTE.CodeType Then 
      objCodeType = CType(objCodeElement, EnvDTE.CodeType) 
      AddBreakpointsToProjectItems(objCodeType.Members) 
     ElseIf TypeOf objCodeElement Is EnvDTE.CodeFunction Then 
      objCodeFunction = DirectCast(objCodeElement, EnvDTE.CodeFunction) 
      AddBreakpointsToProjectItems(CType(objCodeElement, CodeFunction).Parameters) 
     End If 
    End Sub 

End Module 
+0

विजुअल स्टूडियो का कौन सा संस्करण और किस भाषा के लिए यह है? – ChrisF

+0

वीएस 2008 में सी # के लिए जांच की गई, लेकिन अगर मुझे सही याद है तो यह बहुत ही समान है या वीएस 2005 में और वीबी के लिए भी समान है। ध्यान दें कि यह एक्सप्रेस संस्करणों में समर्थित नहीं है। –

+0

ठीक है, हाँ यह उपयोगी जानकारी है। धन्यवाद। लेकिन मेरा वास्तविक सवाल यह है कि जब भी app.exe कॉल * mylib.dll की किसी * विधि को डीबगर में डीबगर * स्वचालित रूप से * ब्रेक (यानी बिना किसी ब्रेकपॉइंट्स) को डीबगर में चाहिए। मान लें कि mylib.dll में कई एंट्री पॉइंट फ़ंक्शंस हो सकते हैं जिन्हें कॉल किया जा सकता है, इसलिए सभी विधियों पर मैन्युअल रूप से ब्रेकपॉइंट डालना मुश्किल है :) – mishal153

3

मुझे नहीं लगता कि दूर है कि स्वचालित रूप से अपने कोड में तोड़ने के लिए जब भी यह कहा जाता है है।

ब्रेकपॉइंट केवल डीबगर के भीतर से मान्य हैं, इसलिए आपको किसी भी तरह डीबगर में सभी एप्लिकेशन चलाने होंगे।

आप इससे क्या हासिल करने की कोशिश कर रहे हैं?

क्या आप सिर्फ जानना चाहते हैं कि आपकी लाइब्रेरी कहां कहलाती है? यदि ऐसा है तो बस अपने प्रवेश बिंदुओं में लॉगिंग जोड़ें।

यदि आपको किसी विशिष्ट एप्लिकेशन के साथ कोई विशिष्ट समस्या है तो सलाह 0xA3 देता है।

+0

मेरे पास डीबगर संलग्न है। हां, मैं बस यह पता लगाने की कोशिश कर रहा हूं कि मेरी लाइब्रेरी कहां जा रही है और कौन सी विधियां बुलाई जा रही हैं। प्रवेश बिंदु लॉगिंग एक समाधान है, जो मैं अब कर रहा हूँ। लेकिन मैं सिर्फ यह जानना चाहता था कि कोई और तरीका है या नहीं। उत्तरों के लिए धन्यवाद। – mishal153

5

मैं एक वर्ग पुस्तकालय में इसे करने की कोशिश नहीं की है, लेकिन यह काम हो सकता है।

System.Diagnostics.Debugger.Break(); 
संबंधित मुद्दे

 संबंधित मुद्दे