Absturzberichte Watchdog für, wenn meine Anwendung abstürzt auf dem Rechner eines Benutzers

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

Frage

Ich arbeite mit einer etwas unzuverlässig (Qt / Windows) Anwendung teilweise für uns von Dritten geschrieben (nur versuchen, die Schuld dort zu verschieben). Ihre neueste Version ist stabiler. Art. Wir bekommen weniger Berichte über Abstürze, aber wir bekommen viele Berichte davon gerade hängen und nie wieder kommen. Die Umstände sind vielfältig, und mit den wenigen Informationen können wir erfassen, haben wir nicht in der Lage gewesen, die Probleme zu reproduzieren.

Am besten, ich möchte eine Art Watchdog zu schaffen, die bemerkt, dass die Anwendung gesperrt ist, und bietet einen Absturzbericht an uns zurück zu senden. Nette Idee, aber es gibt Probleme:

  • Wie weiß der Watchdog den Prozess aufgehängt hat? Vermutlich wir Instrument der Anwendung in regelmäßigen Abständen zu sagen „alles in Ordnung“, um den Watchdog, aber wo setzten wir, dass, so dass es oft genug geschieht guarenteed ist, aber es ist wahrscheinlich nicht auf einem Codepfad sein, dass der App landet auf, wenn es verriegelt.

  • Welche Informationen sollte der Watchdog-Bericht, wenn ein Absturz passiert? Windows verfügt über eine anständige Debug-api, also bin ich zuversichtlich, dass alle interessanten Daten zugänglich ist, aber ich bin nicht sicher, was für das Aufspüren, die Probleme nützlich sein würde.

War es hilfreich?

Lösung

Sie eine Kombination aus einem minidump wollen (Verwendung DrWatson diese zu erstellen, wenn Sie nicht wollen, Ihren eigenen minidump Generation Code hinzufügen) und userdump eine minidump Schöpfung auf einem Hang triggern.

Die Sache automatisch einen Hang Nachweis ist, dass seine schwer zu entscheiden, wann Somethings gehängt und wenn ihr nur langsam oder durch IO Warte blockiert. Ich persönlich bevorzuge, damit der Benutzer die App absichtlich zum Absturz zu bringen, wenn sie ihre hung denken. Neben viel einfacher zu sein (meine apps nicht dazu neigen oft zu hängen, wenn überhaupt :)), auch hilft es ihnen „ein Teil der Lösung zu sein“. Sie mögen das.

Prüfen Sie zunächst das klassische bugslayer Artikel über Crashdumps und Symbole, die auch einige ausgezeichnete Informationen hat darüber, was mit diesen Dingen vor sich geht.

Zweitens erhalten userdump , die Ihnen die Deponien erstellen können, und Anweisungen es zum Einrichten von Deponien zu erzeugen

Wenn Sie den Dump haben, öffnen Sie sie in WinDBG, und Sie werden den gesamten Programmzustand zu inspizieren fähig sein - einschließlich Gewinde und Callstacks, Register, Speicher und Parameter an Funktionen. Ich denke, dass Sie besonders interessiert sein werden die „ ~ * kp in mit “Befehl in Windbg die Aufrufhierarchie eines jeden Thread zu bekommen, und die‚! Sperren‘Befehl, um alle Sperren Objekte zu zeigen. Ich glaube, Sie werden feststellen, dass der Hang zu einem Deadlock von Synchronisationsobjekten fällig wird, die schwierig sein wird, auf der Spur, da alle Threads auf einem WaitForSingleObject Aufruf warten neigen, aber schauen Sie weiter unten auf der Callstacks die Anwendungs-Threads zu sehen (und nicht als ‚Rahmen‘ wie Hintergrund-Threads Benachrichtigungen und Netzwerk-Routinen). Sobald Sie sie nach unten verengt haben, können Sie sehen, was Anrufe gemacht wurden, möglicherweise einige Protokollierung Instrumentierung zu versuchen, die App hinzufügen, und geben Sie weitere Informationen bereit für die nächste Zeit scheitert es.

Viel Glück.

Ps. Schnelle Google erinnerte mich an diese: Debuggen Deadlocks . (CDB ist die Befehlszeile äquivalent windbg)

Andere Tipps

Sie können mit ADPlus von der Microsoft-Debugtools für Windows, die Hänge identifizieren. Es wird zu Ihrem Prozess anhängen und einen Dump (mini oder voll) erstellen, wenn der Prozess hängt oder stürzt ab.

WinDbg ist tragbar und muss nicht installiert werden (Sie müssen die Symbole konfigurieren, obwohl). Sie können eine spezielle Installation erstellen, die Ihre Anwendung unter Verwendung eines Batch zu starten, die (, ADPlus ist ein Kommandozeilen-Tool, so sollten Sie in der Lage sein, einen Weg zu finden, sie zu integrieren irgendwie) auch ADPlus nach Ihrer App startet ausgeführt werden.

übrigens, wenn Sie einen Weg finden, tun die hängen intern zu erkennen und sind in der Lage, den Prozess zum Absturz zu bringen, können Sie mit Fehler Windows-Berichterstattung , so dass die Crash-Dump werden Ihnen zugesandt werden (sollte es dem Benutzer erlauben).

Ich denke, eine separate App, das watchdogging zu tun, ist wahrscheinlich mehr Probleme zu produzieren, als sie löst. Ich würde vorschlagen, dass Sie statt dessen erste Handler erstellen minidumps zu erzeugen, wenn die App abstürzt, dann einen Watchdog-Thread zu der Anwendung hinzufügen, die DELIBERATELY abstürzen, wenn die App die Schienen erlischt. Der Vorteil für den Watchdog-Thread (vs einer anderen app) ist, dass es einfacher sein sollte für die Watchdog um sicher zu wissen, dass die App aus den Schienen gegangen sind.

Wenn Sie die Minidumps haben, können Sie rund um Poke der App-Zustand, um herauszufinden, wenn er stirbt. Dies sollten Sie genügend Hinweise geben, um herauszufinden, das Problem, oder zumindest, wo neben aussehen.

Es gibt einige Sachen bei Codeproject über Minidumps , das ein nützlich sein könnte Beispiel. MSDN mehr Informationen über sie hat auch.

Sie nicht mit einem Watchdog stören. Melden Sie sich an Microsofts Windows-Fehler Reproting (winqual.microsoft.com). Sie werden die stacktraces für Sie sammeln. In der Tat ist es sehr wahrscheinlich, sie sind bereits heute so tun; sie teilen Sie sie nicht, bis Sie sich anmelden.

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