Wie bekomme ich einen Absturzspeicherauszug?

8

Ich muss einen Crash-Dump von einem Programm bekommen. Wie bekomme ich es? Das Programm ist in C # geschrieben. Was genau ist ein Crash-Dump? Wann ist es erstellt? Wo wird es gespeichert? Wie lese ich es?

    
Luke 14.02.2011, 13:16
quelle

5 Antworten

21

Da Sie C # sagen, gehe ich davon aus, dass Sie die Windows-Plattform verwenden.

Ein crashdump oder nur dump ist der vollständige Speicher-Snapshot und andere verwandte Systeminformationen eines Prozesses zu einem bestimmten Zeitpunkt. Dumps können verwendet werden, um Programmabstürze, Hänge, Speicher- und Ressourcenlecks zu beheben und wahrscheinlich weitere Probleme, die ich hier nicht aufgelistet habe.

Im Falle von Abstürzen und Hängenbleiben ist der erste Teil der Daten, die Sie von einem Absturzabbild erhalten möchten, der Aufrufstapel. Dies zeigt den Punkt eines Absturzes oder den Punkt an, an dem eine Operation blockiert und nie zurückgegeben wurde, so dass das Programm nichts tut und nichts tut.

Bei Ressourcenlecks können mehrere Speicherauszüge eines Prozesses über einen bestimmten Zeitraum gesammelt und untersucht werden, um festzustellen, welche Objekte im Speicher am stärksten wachsen. Dies kann helfen, einzugrenzen, welche Teile des Codes das Leck verursachen. Um mehr über das Debuggen bestimmter Probleme zu erfahren, empfehle ich diesen Blog .

Es gibt einige Möglichkeiten, eine Speicherabbilddatei zu erfassen.

  1. Procdump ( Ссылка )
  2. Visual Studio 2010 ( Ссылка )
  3. WinDbg - Nicht zu schlecht, aber einschüchternder als andere Tools

Mit procdump können Sie einfach tun:

%Vor%

Das Ergebnis dieses Befehls ist ein vollständiger Speicherauszug von YourProcessName.dmp, geschrieben in c: \. Der Schalter -ma gibt an, dass ein vollständiges Speicherabbild ausgegeben wird. Wenn Sie einen Absturz debuggen oder aufhängen, können Sie wahrscheinlich ohne den Schalter -ma davonkommen. Denken Sie daran, dass Sie ohne den vollen Speicherauszug, wenn Sie Datenstrukturen untersuchen, wahrscheinlich keine gültigen Daten haben. Ohne den vollständigen Speicherabzug haben Sie immer noch Daten für den Anrufaufbau, die oft gut genug für Abstürze und Abstürze sind. Ich Fehler in der Regel auf der Festplatte Festplatte ist billig, also sammeln Sie die volle Dump.

Procdump erstellt auch automatisch Dumps in Zeitintervallen oder wenn eine bestimmte Bedingung erfüllt ist. Lesen Sie die Dokumentation unter dem obigen Link für weitere Informationen. Ein Schalter, den ich empfehlen würde, ist -e .

%Vor%

Anstatt den Dump sofort zu schreiben, schreibt er ihn nur, wenn Ihr Programm abstürzt.

Mit Visual Studio 2010 können Sie den Prozess mit dem Debugger anfügen und eine Speicherabbilddatei speichern. (Denken Sie daran, wenn Sie Ihr Programm mit F5 debuggen, wird das Programm automatisch angehängt). Wenn sich Ihr Programm in einem "Break-Zustand" befindet (Haltepunkt, unbehandelte Ausnahme, Absturz), wird das Debug -Menü die Option Save Dump As... haben. Dann können Sie diesen Speicherauszug überall dort speichern, wo Sie möchten.

Da Sie C # erwähnt haben, sammeln Sie sehr wahrscheinlich verwaltete Dump-Dateien. Der einfachste Weg ist die Verwendung von Visual Studio 2010. Öffnen Sie einfach die erstellte Dump-Datei wie jede andere Datei und beginnen Sie mit dem Debuggen.

Wenn dies jedoch keine Option ist, können Sie VS2008 oder WinDbg immer mit den SOS-Erweiterungen verwenden. Ich empfehle Visual Studio 2010 sehr, obwohl SOS-Erweiterungen und WinDbg im Allgemeinen eine ziemlich steile Lernkurve haben. Weitere Informationen zu SOS finden Sie in folgenden MSDN-Artikeln hier und hier .

Ein weiterer Grund, warum ich die Verwendung von Visual Studio oder procdump empfehle, ist, dass sie die von Ihnen erwartete Speicherauszugsdatei sammeln. Ich empfehle, den Task-Manager "Create Dump File Tool" zu deaktivieren. Der Grund ist, dass es 64-Bit-Dumps von 32-Bit-Prozessen sammelt, die übermäßig schwierig zu debuggen sind.

    
Evan 15.02.2011, 03:42
quelle
2

Unter Windows XP können Sie mit diesem Dienstprogramm eine Speicherabbilddatei erstellen:

Ссылка

Nach der Installation navigieren Sie zum Installationsverzeichnis und führen Sie

aus %Vor%

von der Befehlszeile aus, wobei PID die PID des Prozesses ist, für den Sie einen Absturzspeicherauszug erhalten möchten (Sie können dies im Task-Manager finden, aber Sie müssen möglicherweise die Spalte zur Standardansicht hinzufügen).

Diese Datei kann dann in Visual Studio geöffnet werden - Sie müssen nur sicherstellen, dass die Symbole erstellt wurden.

In Windows 7 klicken Sie einfach mit der rechten Maustaste auf den Prozess im Task-Manager und wählen Sie "Create Dump File"

    
briantyler 14.02.2011 13:37
quelle
2

Verwenden Sie ADPlus. Es kommt mit den Debugging Tools für Windows. Es erstellt Ordner mit Crash-Dumps unterhalb des Home-Verzeichnisses. Sie können sie anschließend mit WinDbg analysieren.

    
Dennis 14.02.2011 13:50
quelle
1

Luke, ein Absturzspeicher ist eine ganze Tasche von Daten, die sich auf den Status Ihrer Anwendung in dem Moment beziehen, in dem der Absturz passiert ist. Um sie auszugeben, müssen alle diese Informationen irgendwo in einer Textdatei gespeichert werden.

Ein grundlegender Ansatz besteht darin, den gesamten Stacktrace zu protokollieren, wenn eine Ausnahme auftritt, sodass Sie später untersuchen können, welche Methode fehlgeschlagen ist und welche Ausnahme ausgelöst wurde, wie die Parameterwerte waren und so weiter. Dies ist nicht wirklich ein Crush Dump, aber hilft in vielen Fällen sehr.

Es wurde kürzlich von MS etwas über Absturzspeicherausfälle und Anwendungsabstürze entwickelt, ich glaube, dass es tatsächlich mit Windows 7 zusammenhing ...

siehe hier: Wiederherstellung und Neustart der Anwendung

Ссылка

    
Davide Piras 14.02.2011 13:35
quelle
1

Sie können auch versuchen, WinDbg

zu verwenden

Ссылка

Ein Absturzspeicher ist der Fall, wenn der Inhalt des RAM-Speichers und bestimmte Teile des Prozessors in eine Datei kopiert werden. Diese Datei wird am kritischen Punkt eines Fehlers erstellt und kann zum Debuggen des Problems verwendet werden.

Das hat in der Vergangenheit für mich funktioniert. Es ist eine Tastenkombination zum Absturz in Windows.

%Vor%

Ссылка

    
sleath 14.02.2011 13:33
quelle

Tags und Links