Die Core Leute

Warning: This blog is not maintained any more (no update of content or links – as well as information are might deprecated / not valid any more).

[HowTo] Generierung eines User-Mode-DUMPs (Prozess-DUMP)

Hallo,

nachdem ich in meinem letzten Beitrag über die Möglichkeiten berichtet habe, wie wir im CSS einen manuellen Memory-DUMP erzeugen können, möchte ich heute auf User-Mode spezifische DUMPs bzw. besser – Prozess-DUMPs eingehen.

Im CSS fordern wir oft DUMPs von Prozessen an, wenn diese abstürzen oder hängen. Die Analyse eines solchen DUMPs hilft uns dabei nachzuvollziehen, was innerhalb des Prozesses zuletzt durchgeführt wurde (welche im Memory sichtbar sind).

Im Unterschied zu einen FULL-Memory DUMP, welcher Kernel u. Usermode-Informationen beinhaltet, beinhaltet der Prozess-DUMP ausschließlich Informationen über die jeweils spezifische Anwendung. Die Größe eines solchen DUMPs ist daher abhängig davon, wie viel Arbeitsspeicher der Prozess zum Zeitpunkt der Auslösung des DUMPs allokiert hat und welcher DUMP-Typ eingestellt ist.

Wichtig hierbei ist – in den meisten Fällen werden Symbol-Files für eine Analyse der Anwendung bzw. dessen DUMP benötigt, welche während der Kompilierung der Anwendung erzeugt werden. Somit sollte ein solcher DUMP immer vom Hersteller der Anwendung analysiert werden.

Für die Erzeugung eines solchen DUMPs gibt es verschiedene Möglichkeiten.
Nachfolgend möchte ich die von uns hauptsächlich  verwendeten Möglichkeiten aufzählen – die auch von Ihnen verwendet werden können.

Erstellung eines DUMPs über den TaskManager

Seit Windows Vista gibt es die Möglichkeit, einen DUMP eines Prozesses über den TaskManager zu erzeugen. Für die Erzeugung eines solchen DUMPs werden keine Admin-Rechte benötigt  – wobei in diesem Fall nur ein DUMP von einem Prozess erzeugt werden kann, welcher im eigenen Benutzer-Kontext läuft.

Diese Möglichkeit bietet sich an, wenn ein DUMP von einem Prozess erzeugt werden soll, der hängt. Der Prozess muss zum Ausführungszeitpunkt vorhanden sein (von einem terminierten Prozess kann somit kein DUMP erzeugt werden).

Um einen DUMP zu erstellen, gehen Sie bitte folgendermaßen vor:
Starten Sie den TaskManager > Processes > [wählen Sie den Prozess aus, von dem Sie einen DUMP erzeugen möchten] > [rechte Maustaste] > „Create DUMP File“

Erstellung eines DUMPs via Windows Error Reporting (WER)

Seit Windows Vista SP1 steht ein Dienst zur Verfügung, welche automatisch DUMPs in Fall eines Prozess-Absturzes erstellt – der „Windows Error Reporting“ Service, kurz WER.

WER löst den unter früheren Windows Versionen existierenden Dienst „Dr. Watson“ ab (auf diesen werde ich nicht weiter eingehen).

Der WER-Dienst ist in der Standartkonfiguration bereits für die Erstellung eines Small-Usermode-DUMP konfiguriert. Der Dienst ist im Normalfall gestoppt (Startoption manuell) und startet erst, wenn ein Fehler aufgetreten ist.

Beispiel einer Demo-App:

Ein DUMP wird erzeugt.

Die Erzeugung des DUMPs ist abgeschlossen.

 

Und der DUMP abgelegt.

Im Event-Log finden Sie zwei Meldungen:

Log Name:      Application
Source:        Application Error
Date:          18.10.2012 14:45:59
Event ID:      1000
Task Category: (100)
Level:         Error
Keywords:      Classic
User:          N/A
Description:
Faulting application name: AppException_x64.exe, version: 0.0.0.0, time stamp: 0x4ff146e8
Faulting module name: AppException_x64.exe, version: 0.0.0.0, time stamp: 0x4ff146e8
Exception code: 0xc0000094
Fault offset: 0x0000000000001180
Faulting process id: 0x1aa8
Faulting application start time: 0x01cdad26227ba7c0
Faulting application path: D:\AppException_x64.exe
Faulting module path: D:\AppException_x64.exe
Report Id: 62240584-1919-11e2-9bff-00155dd49a0b

Diese signalisiert, dass ein Absturz einer Komponente aufgetreten ist (unabhängig von WER).

Log Name:      Application
Source:        Windows Error Reporting
Date:          18.10.2012 14:46:42
Event ID:      1001
Task Category: None
Level:         Information
Keywords:      Classic
User:          N/A
Description:
Fault bucket 75904921, type 4
Event Name: APPCRASH
Response: Not available
Cab Id: 0

Problem signature:
P1: AppException_x64.exe
P2: 0.0.0.0
P3: 4ff146e8
P4: AppException_x64.exe
P5: 0.0.0.0
P6: 4ff146e8
P7: c0000094
P8: 0000000000001180
P9:
P10:

Attached files:
C:\Users\<USER>\AppData\Local\Temp\WER4B50.tmp.WERInternalMetadata.xml

These files may be available here:
C:\Users\USER\AppData\Local\Microsoft\Windows\WER\ReportArchive\AppCrash_AppException_x64_e191b52e52dff38ae077b86ec09cbf831f8a76_0b43f2a6

Analysis symbol:
Rechecking for solution: 0
Report Id: 62240584-1919-11e2-9bff-00155dd49a0b
Report Status: 0

Dieser Eintrag signalisiert, dass WER ein Problem festgestellt hat.
Im Normalfall wird das DUMP-File unterhalb von %LOCALAPPDATA%\CrashDumps abgelegt – bei Prozessen unterhalb des Bultin\Administrators-Profils.

Möglichkeiten der Konfiguration von WER:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

DumpFolder [REG_EXPAND_SZ]
Hier kann ein spezifischer Pfad für alle WER-DUMP angegeben werden (bspw. C:\WER\).

DumpCount [REG_DWORD]
Max. Anzahl von DUMPs

DumpType [REG_DWORD]
Auch bei der Erstellung von User-Mode-DUMPs können verschiedene DUMP-Typen erstellt werden.
0: Custom dump
1: Mini dump
2: Full dump
Standardmäßig wird ein Mini-DUMP erzeugt.

CustomDumpFlags [REG_DWORD]
Sofern DumpType == 0 ist, kann über diesen Wert konfiguriert werden, welche Informationen abgebildet werden sollen.

Für weitere Informationen hierzu prüfen Sie bitte:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680519(v=vs.85).aspx

Erstellung eines DUMPs via Debug Diag

Debug Diag ist ein Tool, welches Microsoft kostenfrei zur Verfügung stellt..

https://www.microsoft.com/en-us/download/details.aspx?id=49924

Sofern Sie  eine 64-Bit Windows Version verwenden, sollten Sie die 64-Bit Version von Debug Diag installieren – da Sie hiermit sowohl 32- als auch 64-Bit Prozesse als Prozess, von dem Sie ein DUMP erzeugen möchten, auswählen können.

Diese Möglichkeit bietet sich an, wenn ein DUMP von einem Prozess erzeugt werden soll, welcher abstürzt. Debug Diag läuft nach der Einrichtung als Dienst.

Um einen DUMP zu erstellen, gehen Sie bitte folgendermaßen vor:

Öffnen Sie “DebugDiag.Collection.exe”.

Wählen Sie „Crash“ -> Next

Sie können nun die Art des Prozesses auswählen. In den meisten Fällen wählen Sie hier „A specific process“ (dieser beinhaltet auch die Dienst-Prozesse) aus.

Nun werden alle Prozesse angezeigt, welche derzeit auf dem System aktiv sind.
Wählen Sie den Prozess aus, von welchem Sie bei einem Absturz ein DUMP erzeugen lassen möchten.

Mittels der Checkbox „This process instance only“ können Sie wählen, ob tatsächlich nur die selektierte Instanz überwacht werden soll oder alle Prozesse mit dem jeweiligen Namen. Ist diese Option aktiviert, wird die Überwachung der Prozesse mit der PID verbunden. Wenn diese Option deaktiviert ist, wird die Überwachung  der Prozesse nur mit dem Namen assoziiert. Im o.g. Fall wird also von jedem Prozess mit dem Namen „Explorer.exe“ im Fall eines Absturzes ein DUMP erzeugt.

Nun haben Sie die Möglichkeit, Erweiterte-Optionen für die Generierung eines DUMP zu setzen.
Bspw. lässt sich hierüber konfigurieren, bei welcher Ausnahme ein DUMP erzeugt werden soll oder ob spezielle PageHeap-Optionen angewendet werden müssen.

In den meisten Fällen sollten Sie hier keine Veränderung vornehmen.

Nun haben Sie noch die Möglichkeit, einen Namen und Speicherort für diese Regel anzugeben.

Hier haben Sie die Möglichkeit, die Regel direkt zu aktivieren.

Nach einem Klick auf „Finish“ wird die Regel gelistet.
Sie haben nun die Möglichkeit weitere Regeln anzulegen, diese zu bearbeiten oder zu löschen.

Es wird ein Prozess hinzugefügt, welcher den Zielprozess überwacht und einen DUMP erstellt, sobald dieser abstürzt:

Debug Diag ist auch nach einem Neustart aktiv. Sofern Sie keinen DUMP mehr benötigen, sollten Sie die entsprechenden Regeln deaktivieren oder löschen.

Soweit die Möglichkeiten zur Erstellung eines User-Mode-DUMPs, die von uns bevorzugt werden.
Weiterhin gibt es noch andere Möglichkeiten, die in speziellen Fällen angewendet werden (bspw. ADPlus, ProcDump oder das LiveDebugging) – auf die ich jedoch in diesem Beitrag nicht weiter eingehen kann.

Viele Grüße,
Matthias Meiling
Premier Platforms Core Team | Microsoft GBS

———————————-
2018-04-14 – Link zu Debug Diag aktualisiert