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
Którą wersję programu Visual Studio i do jakiego języka to służy? – ChrisF
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. –
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