2017-07-03 3 views
1

Nur für StackOverflow-Ausnahme, ich habe Schwierigkeiten, eine MiniDump beim Konfigurieren von AddVectoredExceptionHandler von einem Prozess, der die CLR geladen hat, zu erstellen.CLR/VectoredExceptionHandler/StackOverflowException/MiniDumpWriteDump

Mein Handler wird aufgerufen, die .dmp-Datei wird erstellt, aber dann schlägt MiniDumpWriteDump fehl.

Ich habe kein Problem, den Dump für andere Ausnahmen, z. Zugriffsverletzung. Wenn die CLR nicht geladen ist und ein StackOverflow-exceptin auftritt, dann bekomme ich auch den Dump erfolgreich geschrieben.

Beispielcode wird unter https://github.com/NicolaiNyberg/DbgSvcExtension bereitgestellt, wobei das CrashHandler-DLL-Projekt die Handler konfiguriert und SoexCh.Cs ein Beispiel dafür ist, dass es von C# aufgerufen wird.

Meine Frage ist: Was passiert in Bezug auf unbehandelte Ausnahme-Handler, sobald die CLR geladen ist, die verhindert, dass der Prozess einen Mini-Dump im Falle einer StackOverflow-Ausnahme schreibt?

+1

Es ist nicht genügend Stapelspeicher verfügbar, damit MiniDumpWriteDump() seine Aufgabe erfüllen kann. Zuverlässige Minidump-Generierung erfordert einen "Guard-Prozess". Wie DebugDiag. –

+0

Danke Hans. Ich habe Ihre Antwort gelesen und festgestellt, dass meine Antwort/Lösung eine Implementierung dessen ist, was Sie vorschlagen. –

Antwort

0

Verschoben Lösung von Frage zu beantworten:

Antwort/Lösung: Damit MiniDumpWriteDump aus einer zertrümmerten Stapel (Stackoverflow-Ausnahme) um erfolgreich zu sein, dann sollte es von einem Worker-Thread aufgerufen werden, die von signalisiert wird der ExceptionHandler. Der CrashHandler wurde mit dieser Implementierung aktualisiert.

+0

Eigentlich sollte es _really_ in einem separaten Watchdog-Prozess sein (wie Hans 'in seinem Kommentar vorgeschlagen). Während ein separater Thread möglicherweise für Stackoverflow-Fehler funktioniert, reicht er möglicherweise nicht aus, um Dinge zu korrumpieren (wie Zugriffsverletzung), die den gesamten Prozess (Ziel/Opfer) verschlingen können. –