Programmgesteuerter Datenhaltepunkt in Visual Studio 2010

9

Ich habe versucht, programmatische Datenhaltepunkte zu verwenden, beispielsweise im CBreakpoint Beispiel, indem Sie SetThreadContext , um das Debug-Register direkt zu setzen. Die meisten Referenzen, die ich finden kann, zeigen an, dass Visual Studio immer dann bricht, wenn es einen Datenhaltepunkt trifft, selbst wenn es diesen Datenhaltepunkt nicht selbst gesetzt hat. Dies scheint jedoch nicht die Funktionsweise von Visual Studio 2010 zu sein.

Ich bin in einer Situation, in der mein Datenhaltepunkt perfekt funktioniert, wenn das Programm nicht debuggt wird (es stürzt mit STATUS_SINGLE_STEP ab, was die Ausnahme ist, die von einem Datenhaltepunkt ausgelöst wird). Es bricht auch richtig, wenn ich mit WinDbg debuggen. Aber wenn Sie es unter Visual Studio 2010 debuggen, scheint es einfach weiterzufahren und den Haltepunkt zu ignorieren. Hat jemand Erfahrung mit dem Verwenden eines programmgesteuerten Datenhaltepunkts unter Visual Studio 2010 unter Windows 7? Gibt es etwas, was ich tun muss, damit sie brechen? (Ich habe versucht, STATUS_SINGLE_STEP zu der Liste der Ausnahmen der ersten Chance hinzuzufügen, ohne das Verhalten zu ändern.)

Gibt es sonst etwas, was ich tun könnte, um die STATUS_SINGLE_STEP -Ausnahme im Debugger zu verschlucken? Würde ein strukturierter Exception-Handler die Ausnahme essen, bevor der Debugger sie sehen kann? Ist irgendetwas davon betroffen, dass es sich um ein x86_64-Programm handelt? Muss ich in den Visual Studio 2010-Einstellungen etwas tanzen?

    
John Calsbeek 22.08.2012, 15:44
quelle

3 Antworten

2

Habe ein wenig getestet, habe VS 2010 SP1 Ultimate auf win7 x64, benutze eine 32bit-Binärdatei, um HW-Breakpoints korrekt zu brechen (sowohl mit als auch ohne SEH). Bei Verwendung einer 64-Bit-Binärdatei wird der einzelne Schritt jedoch nicht abgefangen (und ich musste einige Typen ändern, nur um sie kompilieren zu lassen).

Etwas tiefer graben scheint es, dass VS seltsam wirkt, denn obwohl es den einen Schritt nicht abfängt, kann ich es nicht schaffen, über einen Codeabschnitt zu springen, der einen HW-Haltepunkt auslöst.

Ich habe das Gefühl, dass die Bibliothek die DR-Register nicht korrekt unter x64 setzt, dies kann in SetThreadContext für x64 geschehen.

Aktualisieren

Ich habe ein wenig mehr herumgespielt und festgestellt, dass die von Ihnen verwendete Bibliothek den Thread nicht vor dem Festlegen oder dem Abrufen des Threadkontexts unterbricht, MSDN sagt, das ist ein großes NEIN:

  

Sie können keinen gültigen Kontext für einen laufenden Thread abrufen. Verwenden Sie die Funktion SuspendThread, um den Thread vor dem Aufrufen von GetThreadContext zu unterbrechen.

Aber selbst mit einer anderen Bibliothek funktioniert das richtig den Zielthread auszusetzen und alle Aufrufe ohne Fehler auszuführen, lässt VS den BP nicht abfangen, was mich glauben macht, dass nicht nur die Bibliothek Buggy verwendet, sondern auch der x64-Debugger von VS fehlerhaft ist.

    
Necrolis 29.08.2012, 09:07
quelle
0

Haben Sie für Ihr Projekt ein gemischtes (natives und verwaltetes) Debugging aktiviert? Ich ging zu Projekteigenschaften- & gt; Konfigurationseigenschaften- & gt; Debugger- & gt; Debug-Typ eingestellt auf "gemischt"

hat diese Antwort hier gefunden: Ссылка

    
Mia 09.10.2015 20:31
quelle
-2

Es gibt eine Funktion mit dem Namen DebugBreak() , die Sie verwenden können, um Ihre Ausführung programmgesteuert unter MSVC 2010 zu unterbrechen, aber innerhalb von DebugBreak (Disassembly-Code) beendet wird. Also, wenn Sie nur in Ihrem Code brechen möchten, verwenden Sie __asm int 3 , das ist sehr einfach und funktioniert in allen Intel-kompatiblen CPUs.

Und noch eine Anmerkung, benutzen Sie IsDebuggerPresent() vor einem von DebugBreak() oder __asm int 3 , um Fehler in der Laufzeit zu vermeiden (das wissen Sie natürlich schon! :))

    
BigBoss 01.09.2012 02:06
quelle