5 Stimmen

Diagnose von Deadlocks in Win32-Programmen

Welche Schritte und Techniken gibt es, um einen offensichtlichen Stillstand aufgrund eines Deadlocks in einem Win32-Produktionsprozess zu beheben? Ich habe gehört, dass WinDbg für diesen Zweck verwendet werden kann, aber könnten Sie bitte klare Hinweise geben, wie dies erreicht werden kann?

8voto

Gulzar Nazim Punkte 51098

Diese Beitrag sollte Ihnen den Einstieg in die verschiedenen Optionen erleichtern Lesen Sie die Beiträge mit dem Stichwort Debugging

Ein weiterer nützlicher Artikel über Fehlersuche bei Deadlocks ..

4voto

1800 INFORMATION Punkte 125009

Das Debuggen eines echten Deadlocks ist eigentlich recht einfach, wenn man Zugriff auf den Quellcode und einen Speicherabzug (oder eine Live-Debugging-Sitzung) hat.

Sie brauchen sich nur die Threads anzusehen und diejenigen zu finden, die auf eine gemeinsam genutzte Ressource warten (z. B. aufgehängt in WaitForSingleObject ). Im Allgemeinen muss man von dort aus herausfinden, welche zwei oder mehr Threads sich gegenseitig gesperrt haben, und dann muss man nur noch herausfinden, welcher Thread die Sperrhierarchie durchbrochen hat.

Wenn Sie nicht leicht herausfinden können, welche Threads gesperrt sind, verwenden Sie die in dieser Beitrag hier um die Verriegelungskette für jeden Faden zu verfolgen. Wenn Sie in eine Schleife geraten, sind die Threads in der Schleife diejenigen, die blockiert sind.

1voto

Tal Punkte 1741

Wenn Sie sehr faul sind, können Sie Application Verifier installieren, dann Ihr Modul hinzufügen und im Basistest nur "Sperren" auswählen. Dann können Sie Ihre Anwendung unter jedem Debugger ausführen.
Wenn ein kritischer Abschnitt blockiert ist, finden Sie die Ursache sofort.

0voto

Nescio Punkte 26799

Welche Sprache/IDE verwenden Sie?

In .Net können Sie die Threads einer Anwendung anzeigen: Debug->Fenster->Threads oder Strg+Alt+H

-1voto

Adam Pierce Punkte 32051

Das Debuggen von Deadlocks kann knifflig sein. Normalerweise führe ich eine Art von Logging durch und schaue, wo das Log aufhört. Ich protokolliere entweder in eine Datei oder auf der Debug-Konsole mit OutputDebugString().

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X