Ich suche nach einer Möglichkeit, Minidump-Dateien in meinen Anwendungen zu erzeugen, ähnlich wie bei ProcDump aber vorzugsweise mit Code und nicht um ein 3D-Party-Tool zu extrahieren.
Die Hauptgründe dafür, ProcDump nicht verwenden zu wollen, sind:
1) Die Größe der Binärdatei würde stark ansteigen (Dies ist ein Problem, da meine Apps Freeware sind und die Bandbreite nicht frei ist).
2) Fühlt sich schmutzig an.
3) Ich kann diese App nicht portieren, um in Windows Mobile zu laufen.
Meine Anforderungen sind:
1) Fähigkeit, Mdump-Dateien in einem Fatale-Absturz zu generieren.
2) Ability "pause" die App machen einen Dump, und Contiune wäre ein Bonus.
Wenn dies nicht wirklich eine Option ist, gibt es eine Möglichkeit, die Werte von lokalen Variablen im aktuellen Kontext dynamisch zu erhalten?
Es gibt also eine Lösung, die in den Sinn kommt und die folgenden Ziele erfüllt:
Ich werde diese Anforderung komplett unbekannt machen:
Was ist die Lösung?
Integrieren Sie die erforderlichen benötigten Teile aus dem Microsoft-Beispiel für MDbg.exe, um einen "Just-in-Time" -Debugger bereitzustellen, der den abstürzenden Prozess anhängt, abbricht und trennt.
Schritt 1 - Beginnen Sie mit dem Herunterladen des Quellcodes von hier auf die mdbg: Ссылка
Schritt 2 - Erstellen Sie einen 'Crash'-Handler, der einen Debugger-Prozess erzeugt und auf den Abschluss wartet. Ich benutzte die folgenden Codezeilen, um die gleiche exe mit einigen zusätzlichen Argumenten neu zu starten, um den Debugger aufzurufen und eine xml-Datei nach std :: out auszugeben.
%Vor%Schritt 3 - Schreiben Sie die Debug-Dump-Routine, dies kann in der gleichen exe oder in einer anderen exe sein. Sie müssen die Module 'rohe', 'corapi' und 'mdbgeng' aus der Stichprobe referenzieren (oder die Quelle einschließen). Dann füge ein paar Zeilen zu deinem Main hinzu ():
%Vor%Beispielausgabe
%Vor%Da Sie die volle Leistungsfähigkeit eines Debuggers haben, hält Sie nichts davon ab, so viel oder so wenig zu schreiben, wie Sie möchten, aber das obige Beispiel sollte Ihnen den Einstieg erleichtern.
AKTUALISIEREN
Dies funktioniert mit der .NET 2.0 und / oder 3.5 Runtime ohne weitere Abhängigkeiten.
Dies kann .NET 2.0 / 3.5-Code debuggen, der in einem .Net 4.0-Prozess ausgeführt wird. Allerdings funktioniert es (noch) nicht mit 4.0.
Für 4.0 CLR sehen Sie diesen Beitrag: Ссылка
Sie können MiniDumpWriteDump von AppDomain.UnhandledException oder Application.ThreadException Event-Handler zum Erstellen der Minidump. Dieser Artikel erklärt die Funktion in großen Details: Effektive Minidumps
Sie können auch diese Bibliothek benutzen, die auch andere Funktionen hat: Fangen Sie alle Bugs mit BugTrap!
Bearbeiten
Sieht so aus, als wäre es nicht so einfach, einen nützlichen Minidump zu bekommen. Zuallererst beklagt sich sos.dll, wenn der Dump nicht voll ist (volle Dumps sind etwa 100-150 MB). Zweitens wird das Schreiben von Dump im Catch-Block nicht empfohlen: Gute Dumps erhalten, wenn eine Ausnahme ausgelöst wird.
Wenn Sie eine Winforms-Anwendung haben, hat diese Frage einige nützliche Informationen: Wie funktioniert SetUnhandledExceptionFilter in .NET WinForms-Anwendungen?
Tags und Links c# exception crash-dumps