Using MDMP Files

From Valve Developer Community
Jump to: navigation, search
English (en)Deutsch (de)
... Icon-Important.png

Was ist eine mdmp Datei

Wenn Half-Life 2 abstürzt gibt es eine mdmp Datei aus. Diese Datei ist wie eine Art Black Box Recorder, sie beinhaltet die letzen wenigen Momente vor dem Absturz.

Was benötige ich um die mdmp Datei zu öffnen

Visual Studio und die .pdp (Program Debug Database) Dateien der server.dll und der client.dll. Die .pdb Datei beinhaltet sämtlichen Quellcode deines Projekts. Diese Datei zu haben, bedeutet den Code sehen zu können und nicht mit Assembly debuggen zu müssen. Du solltest deine .pdb Dateien niemals mit deiner Mod herausgeben.

Die .pdb Dateien ändern sich nach jedem Kompiliervorgag. Du solltest mit jedem Modrelease die entsprechenden .pdb Dateien behalten. Für meine Mod habe ich einfach für jedes Release einen eigenen Ordner angelegt und die Dateien hinein kopiert..

Mdmp-folders.jpg


Dies sind die Dateien, die ich für jede Version speichere.

Mdmp-files.jpg


Wie debugge ich

Wenn das Spiel abstürzt schau in deinen Half-Life 2 Ordner, der mit der hl2.exe (Es könnte sich um den HL2DM Ordner handeln, falls du HL2DM als Basis für deine Mod benutzt). Hier sollte sich mindestens eine .mdmp Datei befinden.

Nimm die neueste Datei und setzte sie in den Ordner mit deinen .pdb Dateien (Wenn der Absturz auf deinem PC erfolgte kannst du die .mdmp Datei auch an ihrem Platzt lassen, sie zu verschieben repariert nur die Pfade, damit es die richtigen Dateien finden kann).

Jetzt öffne die Datei, Visual Studio sollte sich öffnen. Du musst evtl. eine sollution Datei (sln) speicher. Drück den Startknopf (oder F5) und es wird den Fehler, mit einer Fehlermeldung, nachstellen. Click auf Unterbrechen.

Wenn der Absturz im gamedll Code passierte wirst du ihn sehen können, wenn nicht wirst du nur einen Assembly Mist sehen.

Aufrufliste

Du kannst die Aufrufliste (Menüleiste > Debuggen > Fenster > Aufrufliste) benutzen um herauszufinden was den Absturz verursacht hat.

Mdmp-callstack.jpg

Hier als kleines Beispiel was einem diese Aufrufliste zeigt:

  • Es stürzt im Server ab (server.dll)
  • Nachdem eine Kugel abgefeuert wurde (CBaseEntity::FireBullets)
  • Und ein Jeep schaden genommen hat (CPropJeep::OnTakeDamage)
  • Ein Combine hat die Kugel abgefeuert (CNPC_CombineS)
  • Der Server stürzte ab nachdem etwas in Lua aufgerufen wurde (GMod spezifisch)

Ein Doppel-Klick auf eine der Funktionen führt dich zu ihr und zeigt dir wie genau sie aufgerufen wurde und mit ein wenig Glück auch mit den genauen Werten der Variablen.


Kein Code

Wenn du keinen Code sehen kannst kann es gut sein, dass die .pdb Datei nicht gefunden wurde oder dass sie nicht zur DLL passt. Dies kannst du im Module Fenster nachprüfen.

Mdmp-modules.jpg

Es gibt ein paar nützliche Informationen in diesem Fenster.

  • Timestamp - vergleiche dies mit dem Timestamp deiner lokalen dateien umdie richtige Version zu finden
  • Informationen - zeigt an ob die .pdb geladen ist oder nicht

Modpath

Wenn du die .mdmp Datei nicht rüberkopieren kannst/willst, dann kannst du den modpath Parameter zum "Befehlsargumente" Feld in der Eigenschaftsbox hinzufügen..

MODPATH=c:\ordner\der\die\pdb\dateien\enthält\

Mdmp-modpath.jpg

Schlussfolgerung

Ein paar Abstürze werden komplett außer Reichweite sein. Du wirst dann eine .mdmp Datei mit ausschließlich OS Aufrufen bekommen. Du kannst diese Abstürze entweder auf Treiber oder Spyware zurückführen und sie ignorieren oder dir um etwas hinterlistigeres wie heap oder stack corruption sorgen machen.

Wenn du nur irgentwie wie ich bist kommen 95% deiner Abstürze von ungültigen/Null Pointern. Mit einer .mdmp Datei wird das Finden und Beseitigen dieser Fehlerquellen zum Kinderspiel.

Man sollte sich beim Arbeiten mit .mdmp Dateien unbedingt vor Augen halten, dass nicht unbedingt die Funktion in der der Absturz ausgelöst wird die eigentliche Fehlerquelle ist. Gerade wenn es sich um eine Funktion handelt, die du nicht progammiert hast. Versuche eher herauszufinden was die Ereignisse die zum Absturz führten verursacht hat als was letztentlich den Absturz ausgelöst hat.