Ich denke, es gibt nur eine Antwort auf Ihre Frage, die Sie als "viel zu viel Arbeit" abgetan haben. Ich glaube jedoch, dass Sie das falsch machen. Lassen Sie mich Schritte zum Hinzufügen eines bedingten Haltepunkts auf Thread-ID vorstellen, die extrem einfach sind, aber nicht offensichtlich, bis Sie sie kennen.
den Debugger an einem Punkt stoppen, wo Sie in den richtigen Thread sind Sie mit dem Debuggen in den Vorgang fortsetzen möchten (die ich schätze, würde, ist in der Regel der erste Thread, der bekommt dort). Geben Sie $TID
in das Überwachungsfenster ein.
einen Haltepunkt mit der Bedingung $TID == <
Wert von $ TID von Watch Window>
, hinzufügen
Beispiel: $TID == 0x000016a0
Execution Weiter.
$TID
eine magische Variable für Microsoft-Compiler ist (da zumindest von Visual Studio 2003), die den Wert der aktuellen Thread-ID hat. Es macht es viel einfacher als das Betrachten (FS + 0x18) [0x24]. = D
Das heißt, Sie können das gleiche Verhalten wie die One-Shot Breakpoints des Debuggers mit einigen einfachen Makros erhalten. Wenn Sie einen Schritt ausführen, setzt der Debugger hinter den Kulissen einen Haltepunkt, führt diesen Haltepunkt aus und entfernt ihn dann. Der Schlüssel zu einer konsistenten Benutzerschnittstelle ist das Entfernen dieser Haltepunkte, wenn ANY Haltepunkt erreicht wird.
Die folgenden zwei Makros bieten Step Over und Run To für den aktuellen Thread Cursor. Dies geschieht auf die gleiche Weise wie der Debugger, wobei die Breakpoints nach der Ausführung entfernt werden, unabhängig davon, welcher Breakpoint getroffen wird.
Sie möchten eine Tastenkombination zuweisen, um sie auszuführen.
HINWEIS: Eine Warnung - Der Step Over nur Makro funktioniert einwandfrei, wenn der Cursor Sie auf der Linie wollen, ist über Schritt. Dies liegt daran, dass die aktuelle Position durch die Cursorposition bestimmt wird und einfach eine Zeile zur Zeilennummer hinzugefügt wird. Möglicherweise können Sie die Standortberechnung durch Informationen zum aktuellen Ausführungspunkt ersetzen, obwohl ich diese Informationen nicht von der Macro IDE finden konnte.
Hier sind sie und viel Glück Bugjagd !!
Um diese Makros in Visual Studio zu verwenden:
1. Öffnen Sie die Makro-IDE (aus dem Menü wählen: Tools-> Makros-> Makro IDE ...)
2. Hinzufügen eine neue Code-Datei (aus dem Menü: wählen: Ausbau-> neues Element hinzufügen ..., wählt -Code Datei und klicken Sie hinzufügen)
3.es Einfügen in diesem Code.
4. Speichern Sie die Datei.
Um Tastenkombinationen hinzufügen für diese Makros in Visual Studio ausgeführt wird:
1. Öffnen Sie Optionen (aus dem Menü wählen: Tools-> Optionen)
2. bis erweitern Umfeld-> Tastatur
3. In Befehle anzeigen, die Folgendes enthalten:, Typ Makros., um alle Ihre Makros zu sehen.
4. ein Makro auswählen, dann klicken Sie in Drücken von Tastenkombinationen:
5. Geben Sie die Combo Sie (Backspace löscht getippt Combos)
6. Klick Assign setzen Ihre Verknüpfung verwenden, ausgeführt werden soll das ausgewählte Makro.
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module DebugHelperFunctions
Sub RunToCursorInMyThread()
Dim textSelection As EnvDTE.TextSelection
Dim myThread As EnvDTE.Thread
Dim bp As EnvDTE.Breakpoint
Dim bps As EnvDTE.Breakpoints
' For Breakpoints.Add()
Dim FileName As String
Dim LineNumber As Integer
Dim ThreadID As String
' Get local references for ease of use
myThread = DTE.Debugger.CurrentThread
textSelection = DTE.ActiveDocument.Selection
LineNumber = textSelection.ActivePoint.Line
FileName = textSelection.DTE.ActiveDocument.FullName
ThreadID = myThread.ID
' Add a "One-Shot" Breakpoint in current file on current line for current thread
bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID)
' Run to the next stop
DTE.Debugger.Go(True)
' Remove our "One-Shot" Breakpoint
For Each bp In bps
bp.Delete()
Next
End Sub
Sub StepOverInMyThread()
Dim textSelection As EnvDTE.TextSelection
Dim myThread As EnvDTE.Thread
Dim bp As EnvDTE.Breakpoint
Dim bps As EnvDTE.Breakpoints
' For Breakpoints.Add()
Dim FileName As String
Dim LineNumber As Integer
Dim ThreadID As String
' Get local references for ease of use
myThread = DTE.Debugger.CurrentThread
textSelection = DTE.ActiveDocument.Selection
LineNumber = textSelection.ActivePoint.Line
FileName = textSelection.DTE.ActiveDocument.FullName
ThreadID = myThread.ID
LineNumber = LineNumber + 1
' Add a "One-Shot" Breakpoint in current file on current line for current thread
bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID)
' Run to the next stop
DTE.Debugger.Go(True)
' Remove our "One-Shot" Breakpoint
For Each bp In bps
bp.Delete()
Next
End Sub
End Module
Haftungsausschluss: Ich schrieb dieses Makros in Visual Studio 2005. Sie können sie wahrscheinlich gut in Visual Studio 2008 verwenden. Sie müssen möglicherweise für Visual Studio 2003 und vorher geändert werden.
Funktioniert das für jeden? Ich konnte es nicht funktionieren lassen. –
Es funktioniert für mich. = D Was war dein Fehler? – Aaron
@Aaron: Ich benutze VS 2008, wenn ich $ TID im Watch-Fenster gebe ich bekomme den Fehler "Der Name existiert nicht im aktuellen Kontext" – akif