Was ist der beste Weg, einen Debugger genau zum richtigen Zeitpunkt an einen Prozess in VC++ anzuhängen?

StackOverflow https://stackoverflow.com/questions/663449

Frage

Beim Debuggen müssen Sie manchmal einen bereits laufenden Prozess anhängen, anstatt einfach die Anwendung in einem Debugger zu starten.

Für mich ist es üblich, einen Sleep()- oder MessageBox-Aufruf einzufügen, damit es einfacher ist, einen Debugger anzuhängen.Ich mache mir Sorgen, dass einige davon irgendwann der Quellcodeverwaltung zugewiesen werden könnten.

Was kann man am besten tun, um diese Situation zu vermeiden und gleichzeitig genügend Zeit zu verzögern, damit Sie Ihren Debugger an einen laufenden Prozess anhängen können?

Schützen Sie den Ruhezustand oder das Nachrichtenfeld mit einem #ifdef _DEBUG ist eine Möglichkeit, aber ich frage mich, ob es eine bessere Möglichkeit gibt.

Bei einem Schlaf haben Sie auch das Problem, dass Sie sich möglicherweise nicht rechtzeitig anlegen.Bei einer MessageBox haben Sie das Problem, dass Sie möglicherweise remote debuggen oder einen Prozess debuggen, der keine sichtbare GUI hat (Beispiel: Ausführung als Dienst unter Vista).

War es hilfreich?

Andere Tipps

Um einen Debugger an einem bestimmten Punkt zu anbringen, haben Sie mehrere Möglichkeiten:

Am einfachsten ist es nur DebugBreak zu nennen, was so ziemlich gleichwertig ist, __asm int 3 funktioniert aber auch auf anderen Architekturen (MSVC für x64 erlaubt keine Inline-Assembler, wenn ich mich richtig erinnere). Das wird die Just-in-Time-Debugger-Fenster aufzurufen, und Sie werden von registrierten Debugger (d Visual Studio) auswählen können, um den Prozess zu befestigen.

Alternativ können Sie einen Anruf vorstellen Sleep, Ihnen die Möglichkeit zu geben, den Debugger zu befestigen. Sie sollten #ifdef _DEBUG um diese verwenden, um sicherzustellen, dass Sie nicht wirklich tun Schiff mit diesem Code enthalten.

Eine Frage: Warum können Sie nicht den Code aus dem IDE ausführen? Ist es ein Service oder ein IIS-DLL geladen oder ähnliches?

In diesem Fall können Sie die ImageFileExecutionOptions Registrierungsschlüssel überprüfen, mit dem Sie einen Debugger zur Zeit befestigen kann, dass der Prozess beginnt.

Wenn Sie cdb hierfür verwenden, können Sie konfigurieren, dass entweder als Server oder Client zu einem WinDbg-Instanz und debuggen, die Art und Weise. Ich habe dies in der Vergangenheit getan von WinDbg als Kernel-Debugger, und von ImageFileExecutionOptions beginnt ntsd -d mit dem genannten Verfahren. Dies bewirkt, dass WinDbg in Benutzermodus brechen. Dies ist manchmal eine nützliche Technik.

Eine andere Variante, die ich manchmal verwenden ist

while( !::IsDebuggerPresent() )
    ::Sleep( 100 ); // to avoid 100% CPU load

es sollte nur still warten, bis Sie Ihren Debugger an den Prozess anhängen.

Freddy und Reoa haben die richtigen Lösungen. Aber ich wollte einen Grund hinzu, warum nicht eine MessageBox zu verwenden.

eine MessageBox angezeigt nur teilweise stoppt Ihre Anwendung. Weil Sie UI angezeigt werden, immer noch eine Meldung Pumpe läuft mindestens einen Faden in Ihrem Programm auf. Also, wenn Ihr Code tut eine der folgenden Bedingungen.

  1. Kommuniziert über Windows-Messages
  2. Hat nicht-triviale UI
  3. Ist Multi-Threaded

Sie werden im Wesentlichen einen Debugger in einem Zustand werden mögen, aber in einem ganz anderen Zustand zu Ihrem Programm zu befestigen. Dies kann zu verwirrenden Situationen und Fehlern führt.

Wir haben vor kurzem eine Änderung in unserer Code-Basis nie eine MessageBox zu zeigen, um Pause aus diesem Grunde zu erleichtern. Es produziert sehr schlechtes Verhalten für eine nicht-triviale Anwendung.

Mit auf ‚genau den richtigen Punkt‘ befestigen ist ein Schmerz ... eine Option ist, sondern explizit Debugbreak () Anweisungen in den Code, das Problem zu zwingen und sie mit #ifdef _DEBUG Bewachung wäre eine gute Idee zu sein. Wir verwenden ein ASSERT-Makro, das Debugbreak () aufrufen können, so können Sie einfach ASSERT schreiben (false)

Eine weitere Möglichkeit zu prüfen, ist ‚Bilddatei Ausführungsoptionen‘ mit dem Debugger automatisch zu starten. Sehen Sie diese Blog rel="nofollow und die MSDN Dokumentation.

Nachschlagen:

DebugBreak, __debugbreak und Freunde

oder

static void timeToChase() { __asm ​​{ int 3;};}

__asm int 3 

Diese Festhaltepunkt wird die Debug-Dialog aufzurufen, die Sie an den Prozess anhängen lassen. Wickeln Sie, dass in #ifdef _DEBUG und Sie werden nur traf es in Debug-Builds.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top