Was entspricht System.Diagnostics.Debugger.Launch () in nicht verwaltetem Code?

8

Ich muss einen Debugger aus meinem nativen C ++ - Programm starten, wenn bestimmte Bedingungen erfüllt sind. In C # rufe ich einfach System.Diagnostics.Debugger.Launch () auf. Ich dachte, dass Win32 DebugBreak () Aufruf wird, was ich will, aber es beendet nur die Anwendung, wenn kein Debugger vorhanden ist.

Wie starte ich eine neue Instanz des Debuggers (der berühmte "Mögliche Debugger" -Dialog) aus nativem Code? Ist es überhaupt möglich? Ich könnte versuchen, COM zu verwenden, um eine neue Instanz von Visual Studio zu erstellen, aber es ist irgendwie kompliziert und wird mich auch zu einer bestimmten Version von VS sperren.

    
Ivan Krivyakov 02.12.2013, 21:08
quelle

3 Antworten

9

Ich stelle fest, dass es möglich ist, vsjitdebugger.exe direkt mit der PID des aktuellen Prozesses aufzurufen. Stellen Sie sicher, dass "Nativ" in Extras- & gt; Optionen- & gt; Debugging- & gt; Just-in-Time in Visual Studio ausgewählt ist.

Hier ist C ++ - Code, um den Debugger zu starten. Es verwendet UNICODE-Versionen verschiedener Win32-APIs. Ich bekomme System-Verzeichnis, weil CreateProcess () nicht PATH verwendet.

%Vor%     
Ivan Krivyakov 04.12.2013, 22:40
quelle
8

DebugBreak () ist in Ordnung, so ist das __debugbreak () intrinsisch. Beide machen dasselbe, sie stürzen das Programm mit einer STATUS_BREAKPOINT-Ausnahme ab. Was dann den Windows-Fehlerberichterstattungsdialog auslöst, es rollt für eine Weile herum und bietet dann die Schaltfläche Debuggen an. Was dann den Debugger startet.

Der einzige wirkliche Fehler, den Sie machen könnten, ist, nicht lange genug auf den WER-Dialog zu warten und Abbrechen zu schnell zu drücken. Oder WER deaktiviert haben. Wenn überhaupt kein Debugger verfügbar ist, dann können Sie keinen auswählen.

Der Registrierungsschlüssel, auf den es ankommt, ist HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger. Normalerweise auf "vsjitdebugger.exe" eingestellt, die den Dialog "Mögliche Debugger" anzeigt.

    
Hans Passant 02.12.2013 22:14
quelle
0

Rufen Sie _CrtDbgBreak() aus Ihrem Visual C ++ - Code auf, kompilieren Sie sie erneut, führen Sie Ihr Programm aus, und wählen Sie dann aus Debuggen Sie das Programm aus dem Dialog.

    
Christian 24.11.2015 14:03
quelle

Tags und Links