2013-04-03 6 views
5

Ich verlasse mich auf Windows Error Reporting, um vollständige Benutzer-Modus-Dumps für eine große Multithread-Anwendung zu erstellen. Ich weiß, dass, als ich anfing es zu verwenden (Anfang 2012) diese Dumps alle Anwendungsspeicher und vollständige Stapel für alle Threads enthielten, die genau für die Zeit waren, als die Anwendung abstürzte (warf die unbehandelte Ausnahme usw.). Aber zu einem unbekannten Zeitpunkt im letzten Jahr haben sich die von WER erstellten Crash-Dumps geändert. Sie enthalten immer noch den gesamten Speicher, sondern nur ein Thread zeigen, und der Stapel wird von nach der Prozess sein, bereits heruntergefahren:Wann erstellt die Windows-Fehlerberichterstellung eine Speicherabbilddatei? Ist es konfigurierbar? Hat sich das in Windows 7 geändert?

[email protected]() + 0x14 bytes 
    [email protected]() + 0x141 bytes  
    [email protected]() + 0x74 bytes 
    [email protected]() + 0x18928 bytes 

Dies ist ein nicht verwalteter (unmanagable?) 32-Bit-C++ Anwendung kompiliert mit VS2010 SP1, läuft auf 64-Bit Win7 SP1 (und aktualisiert). Kennt jemand Windows-Updates, die das WER-Verhalten im letzten Jahr verändert haben? Gibt es etwas konfigurierbares anderes als 'HKLM \ SOFTWARE \ Microsoft \ Windows \ Windows Fehlerberichte \ LocalDumps \ AppName.exe'?

Das Beenden der Anwendung durch Aufrufen von "RaiseFailFastException" führt weiterhin zu einem guten Dump mit gültigen Stapeln für alle Threads.

+0

Nichts, was ich gehört habe. Die einfache Erklärung ist, dass Ihre App nur aus einem anderen Grund abstürzt. –

+0

Nein, ich erhalte explizit eine Ausnahme, um die Erstellung des Speicherabzugs zu testen, und ich vermisse Stacks sowohl in der neuesten Version der Anwendung als auch in der Version von vor einem Jahr, die ursprünglich funktionierte. Trotzdem danke. –

Antwort

3

Aha! Eine Drittanbieterbibliothek ruft SetUnhandledExceptionFilter auf, wodurch verhindert wird, dass die Windows-Fehlerberichterstattung die ursprüngliche Ausnahme erhält. Ihr Handler hat eine interne Bereinigung durchgeführt, die dann abgebrochen wurde. An diesem Punkt konnte WER endlich einen Dump erstellen.

Für jeden, der auf diese Art von Problem stößt, empfehle ich zu überprüfen, dass die installierten Handler (die Rückgabewerte von SetUnhandledExceptionFilter, set_terminate, etc.) sind, was Sie erwarten (Null, wenn Sie sich auf WER oder Ihre eigenen Handler oder CrashRpt verlassen).

+0

Nützliche Informationen hier: http://www.debuginfo.com/articles/debugfilters.html#overwrite –

0

Es ist besser, Ihre Anwendung selbst-Dump-Writer zu machen, wenn es abstürzt. Sie müssen nur SetUnhandledExceptionFilter Funktion aufrufen, geben Sie den Rückruf an. Verwenden Sie im Rückruf MiniDumpWriteDump Funktion mit MiniDumpWithFullMemory Dump-Typ.

Ihr Ausnahmefilter wird immer dann aufgerufen, wenn eine nicht behandelte (durch Ihren Code) Ausnahme auftritt. In dem Rückruf wird es besser sein, alle anderen Threads Ihres Prozesses aufzuzählen und zu unterbrechen.

Möglicherweise müssen Sie auch einen Haken für SetUnhandledExceptionFilter selbst installieren! Warum? Nun, CRT würde immer deaktivieren alle installierten Ausnahmefilter, und durch die Hooked-Funktion, können Sie das vermeiden.

+0

Sieht so aus, als müsste ich das machen. Ich verwende die [CrashRpt] (https://code.google.com/p/crashrpt/) -Bibliothek. –

+2

Wenn es möglich ist, sich auf die WER-Dumps zu verlassen (d. H. Keine zusätzlichen Daten im unbehandelten Filter, keine spezifische Benutzerbenachrichtigung), ist die Verwendung von WER * viel besser * (wenn Sie WinXP nicht unterstützen müssen). Es wird Ihnen einen Absturz in * allen * Absturzszenarien geben, sogar in einem beschädigten Stapel, in dem UHEF nicht einmal aufgerufen wird. Plus: (Zitat MS) * MiniDumpWriteDump sollte von einem separaten Prozess aufgerufen werden, wenn überhaupt möglich, und nicht innerhalb des Zielprozesses (...) * Und ich kann Ihnen sagen, dass dies wirklich kompliziert wird. –

+0

Sorry, aber ich muss sagen, dass dies ein sehr schlechter Ratschlag ist. @MartinBa zeigt korrekt auf die Dokumente, aber die Dokumente sagen nicht, warum * das nicht tun sollte. Tatsächlich ruft "MiniDumpWriteDump" intern "LoadLibraryEx()" auf, und wenn Sie die Lade-Sperre halten, wird der Prozess zwangsläufig innerhalb des Aufrufs blockiert. [Dieser Diskussionsthread] (https://groups.google.com/d/msg/microsoft.public.windbg/Kca8A-pV914/UEd48t2OzccJ) hat eine gute Erklärung von einem der WER-Entwickler, warum dies einfach unvermeidlich ist. – kkm