2010-04-12 8 views
9

Mam bibliotekę zarządzanych klas (np. Mylib.dll) i zarządzaną przez inną firmę aplikację (np. App.exe), która używa pliku mylib.dll. Mam kod mylib.dll, ale nie z pliku app.exe. Więc obecnie robię to, buduję plik mylib.dll, kopiuję go do katalogu app.exe, uruchamiam app.exe i dołączam do procesu. W ten sposób, jeśli umieszczę punkty przerwania w kodzie mylib.dll, widzę, że są trafieni. Ale czy jest tak, aby automatycznie włamać się do kodu mylib.dll, gdy jakakolwiek zewnętrzna aplikacja wywoła jedną z odkrytych metod? to znaczy. Tylko dla punktów wejścia biblioteki DLL.Czy istnieje sposób automatycznego włamania się do debuggera po wywołaniu funkcji biblioteki klas?

dzięki, Mishal

Odpowiedz

7

Pod Project -> Właściwości -> Debug -> Start Action należy określić opcję Uruchom program zewnętrzny i wprowadź ścieżkę do app.exe. To powinno uruchomić app.exe z załączonym debuggerem.

Zobacz także How to: Change the Start Action for Application Debugging

Aktualizacja: Wartości graniczne w Visual Studio są albo związane w pewnym miejscu (tj określonej linii kodu w pliku źródłowym) lub do nazwy funkcji. Dlatego w zasadzie masz dwie możliwości przerwania w dowolnym momencie wywołania funkcji w twoim zespole: albo umieść punkty przerwania na wszystkich deklaracjach funkcji lub na wszystkich nazwach funkcji (Debuguj -> Nowy punkt przerwania -> Przerwij nazwę funkcji). Niestety ta ostatnia opcja wymaga pełnej nazwy funkcji i nie zezwala na stosowanie symboli wieloznacznych.

Inną alternatywą, którą możesz rozważyć, to umieszczenie Debug.Assert(false) na początku wszystkich funkcji biblioteki.

Jeszcze inną opcją byłoby użycie makra programu Visual Studio. Makro poniżej iteracje nad swoim kodem DOM i dodaje punkt przerwania do wszystkich publicznych metod i właściwości:

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

Którą wersję programu Visual Studio i do jakiego języka to służy? – ChrisF

+0

Sprawdzone pod kątem C# w VS 2008, ale jeśli dobrze pamiętam, jest bardzo podobny lub taki sam w VS 2005 i VB, jak również. Zauważ, że nie jest to obsługiwane w wersjach Express. –

+0

OK, tak, to jest przydatne informacje. Dzięki. Ale moim rzeczywistym pytaniem jest to, że chcę, aby debugger * automatycznie * łamał (tj. Bez żadnych punktów przerwania) w debuggerze, gdy app.exe wywołuje * dowolną * metodę mylib.dll. Załóżmy, że plik mylib.dll może mieć wiele funkcji punktu wejścia, które mogą być wywoływane, więc umieszczanie punktów przerwania ręcznie na wszystkich metodach jest bardzo trudne :) – mishal153

3

nie sądzę, że jest z dala automatycznie przerwać w kodzie kiedy to się nazywa.

Punkty przerwania są ważne tylko z poziomu debuggera, więc musisz jakoś uruchomić wszystkie aplikacje w debugerze.

Co próbujesz osiągnąć przez to?

Czy chcesz tylko wiedzieć, kiedy nazywa się twoja biblioteka? Jeśli tak, po prostu dodaj logowanie do punktów wejścia.

Jeśli masz konkretny problem z konkretną aplikacją, postępuj zgodnie z poradą, którą daje 0xA3.

+0

Mam dołączony debugger. Tak, właśnie próbuję dowiedzieć się, kiedy moja biblioteka jest wywoływana i które metody są wywoływane. Rejestrowanie punktów wejścia jest rozwiązaniem, które teraz robię. Ale chciałem tylko wiedzieć, czy jest jakakolwiek inna droga. Dzięki za odpowiedzi. – mishal153

5

nie próbowałem go w bibliotece klasy, ale to może działać.

System.Diagnostics.Debugger.Break(); 
Powiązane problemy