Wie kann ich einen win32-Prozess debuggen, der unerwartet unbemerkt beendet wird?

7

Ich habe eine Windows-Anwendung in C ++ geschrieben, die gelegentlich verdampft. Ich benutze das Wort verdampfen, weil nichts zurückbleibt: keine "Entschuldigung" -Nachricht von Windows, kein Absturzspeicher von der Dr. Watson-Einrichtung ...

Einmal ist der Absturz unter dem Debugger aufgetreten, der Debugger ist nicht kaputt gegangen --- er hat gezeigt, dass die Anwendung noch läuft. Als ich die Ausführung manuell angehalten habe, habe ich festgestellt, dass mein Prozess keine Threads mehr hat.

Wie kann ich den Grund für die Beendigung dieses Prozesses erfassen?

    
Matthew Xavier 18.12.2008, 16:20
quelle

11 Antworten

5

Sie könnten versuchen, das adplus-Dienstprogramm im Windows-Debugging-Tool-Paket zu verwenden.

> %Vor%

Das Auto-Dump-Tool bietet Mini-Dumps für Ausnahmen und einen vollständigen Dump, wenn die Anwendung abstürzt.

    
chills42 18.12.2008, 16:28
quelle
4

Wenn Sie Visual Studio 2003 oder höher verwenden, sollten Sie die Fehlerbehebungsfunktion "Erste Chance Exception" des Debuggers aktivieren, indem Sie ALLE unter Debug Menu | Ausnahmen Dialog. Aktivieren Sie jede Option, bevor Sie den Debug-Build des Prozesses im Debugger starten.

Standardmäßig sind die meisten dieser Exception-Handler für die erste Chance im Debugger deaktiviert. Wenn also Windows oder Ihr Code eine Ausnahme auslöst, erwartet der Debugger, dass Ihre Anwendung damit umgeht.

Das First-Exception-Exception-System ermöglicht es Debuggern, jede mögliche Ausnahme, die vom Prozess und / oder System ausgelöst wird, abzufangen.

Ссылка

    
Heston T. Holtmann 18.12.2008 16:39
quelle
3

Alle anderen Ideen sind gut.

Aber es klingt auch so, als ob die Anwendung abort () oder terminate () aufruft.

Wenn Sie es im Debugger ausführen, setzen Sie einen Haltepunkt für beide Methoden und exit () nur für ein gutes Maß.

Hier ist eine Liste von Situationen, in denen terminal aufgerufen wird wegen Ausnahmen geht es schief.

Siehe auch: Warum wird der Destruktor nicht bei einer Ausnahme aufgerufen?

Dies zeigt, dass eine Anwendung beendet wird (), wenn eine Ausnahme nicht abgefangen wird. Also kleben Sie einen catch-Block in main (), der den Fehler meldet (in eine Log-Datei), und werfen Sie ihn erneut.

%Vor%     
Martin York 18.12.2008 16:49
quelle
2

Nun, das Problem ist, dass Sie eine Zugriffsverletzung bekommen. Sie möchten möglicherweise mit WinDBG anfügen und alle Ausnahmefilter aktivieren. Es kann immer noch nicht helfen - ich vermute, Sie bekommen Speicher Korruption, die keine Ausnahme wirft.

Sie können sich die vollständige Seitenüberprüfung ansehen

Vielleicht möchten Sie auch diese ältere Frage lesen Haufen Korruption für einige Ideen zu Werkzeugen.

    
Cory Foy 18.12.2008 16:36
quelle
2

Die häufigste Ursache für dieses plötzliche Verschwinden ist ein Stack-Überlauf, der normalerweise durch eine Art unendliche Rekursion verursacht wird (die natürlich eine Kette von Funktionen beinhalten kann, die sich gegenseitig aufrufen).

Ist das eine Möglichkeit in Ihrer App?

    
Will Dean 18.12.2008 16:40
quelle
1

Sie können die Windows-Protokolle in Ereignisanzeige unter Windows überprüfen.

    
Filip Dupanović 18.12.2008 16:29
quelle
1

Zunächst möchte ich sagen, dass ich nur eine mäßige Erfahrung in der Windows-Entwicklung habe. Danach denke ich, dass dies ein typischer Fall ist, in dem ein Protokoll helfen kann.

In der Regel wird das Debugging und die Protokollierung orthogonaler Informationen durchgeführt. Wenn Ihr Debugger nutzlos ist, wird Ihnen wahrscheinlich das Protokoll helfen.

    
dario minonne 18.12.2008 16:31
quelle
1

Dies könnte ein Aufruf von _exit () oder einem Windows-Äquivalent sein. Versuchen Sie, einen Haltepunkt auf _exit ... festzulegen.

    
Arkadiy 18.12.2008 19:38
quelle
0

Haben Sie versucht, PC Lint etc und führen Sie es über Ihren Code? Versuchen Sie, mit maximalen Warnungen zu kompilieren Wenn dies eine .NET-Anwendung ist, verwenden Sie FX Cop.

    
Fortyrunner 29.12.2008 22:36
quelle
0

Mögliche Ursachen kommen in den Sinn.

  • TerminateProcess ()
  • Stapelüberlauf-Ausnahme
  • Ausnahme bei der Behandlung einer Ausnahme

Insbesondere die letzte führt zum sofortigen Ausfall der Anwendung.
Der Stapelüberlauf - Sie erhalten eine Benachrichtigung, aber unwahrscheinlich.

Gehen Sie in den Debugger, ändern Sie alle Ausnahmebenachrichtigungen in "stop always" statt "stop which not handled", und tun Sie, was Sie tun, um den Programmfehler zu verursachen. Der Debugger stoppt, wenn Sie eine Ausnahme erhalten und Sie entscheiden können, ob dies die Ausnahme ist, nach der Sie suchen.

    
Stephen Kellett 13.05.2010 09:12
quelle
0

Ich habe ein paar Stunden damit verbracht, mich in Visual Studio 2017 mit einer 64-Bit-Anwendung unter Windows 7 zu befassen. Ich musste einen Haltepunkt für die RtlReportSilentProcessExit -Funktion festlegen, die in die Datei ntdll.dll . Nur der Name der Basisfunktion war genug für Visual Studio, um es zu finden.

Nachdem ich Visual Studio automatisch Symbole für die C-Standardbibliothek heruntergeladen hatte, stoppte es automatisch auch bei der Laufzeitausnahme, die das Problem verursachte.

    
Ryan Armstrong 23.10.2017 19:04
quelle

Tags und Links