Call-Stack zur Laufzeit
-
02-07-2019 - |
Frage
Ich möchte den Call-Stack zur Laufzeit für den Zugriff auf eine native C ++ Anwendung. Ich bin der IDE nicht verwenden. Wie kann ich den Call-Stack angezeigt werden?
Update: Ich habe eine Funktion, die von vielen Punkten auf der ganzen Anwendung aufgerufen wird. Er stürzt in seltenen Fällen. Ich war auf der Suche nach einer Möglichkeit, den Namen des Anrufers zu erhalten und melden Sie es.
Andere Tipps
Hier finden Sie aktuelle StackWalk64 .
Wenn Sie tun dies auf .NET gewohnt sind, dann sind Sie in für eine böse Überraschung.
Sie sollten betrachten Sie Ihre nicht behandelte Ausnahme Filter und ein Schreiben Minidump-Datei aus innerhalb dieser Gruppe. Es ist gar nicht so kompliziert und ist gut dokumentiert . Just-Stick auf das Minimum von Dingen, die Sie einmal in Ihrem nicht behandelte Ausnahme Filter tun (lesen Sie, was können alles schief gehen , wenn Sie kreativ).
Aber auf der sicheren Seite zu sein (Ihr nicht behandelte Ausnahme Filter möglicherweise versehentlich überschrieben werden), könnten Sie Ihren Code hineingelegt __try / __ außer Block und schreiben die minidump aus der Filterfunktion (beachten Sie, Sie können keine Objekte haben, die automatische erfordern Abwickeln in einer Funktion mit __try / __ außer Block, wenn Sie sie tun müssen, sollten sie in eine separate Funktion setzen):
lange __stdcall myFilter (EXCEPTION_POINTERS * pexcept_info)
{
mycreateminidump (pexcept_info);
Rückkehr EXCEPTION_EXECUTE_HANDLER;
}
Leere myfunc ()
{
__try {
// Ihre Logik hier
} __Except (myFilter (GetExceptionInformation ())) {
// Ausnahme behandelt
}
}
Sie können dann mit einem Debugger Ihrer Wahl die Dump-Datei überprüfen. Visual Studio und Debugger von Windows-Debugging Tools-Paket können minidumps behandeln.
Wenn Sie eine Aufrufliste des Absturzes erhalten möchten, was Sie wirklich wollen, zu tun ist, post mortem Debuggen . Wenn Sie eine Aufrufliste der Anwendung überprüfen möchten, während er läuft, dann ist dies eine von vielen Funktionen
Wenn Sie nicht aktiv debuggen, können Sie „Crash“ die App eine minidump erzeugen (diese nicht-invasiv durchgeführt werden kann und lässt die App läuft weiter). IIRC DrWatson lassen Sie dies tun, wenn sie nicht von MS Unterstützung userdump wird. Sie können dann laden Sie die Sicherung in windbg und sehen Sie die Aufrufliste + Variablen usw. gibt. Sie werden Ihre App-Symbole müssen Sinn der Spur zu machen. Wenn Sie sich für eine einfachere Laufzeitcode Stil Spuren suchen, habe ich eine einfache Klasse empfehlen, die Sie auf jeder Methode instanziiert, schreibt der Konstruktor des Name Methode Outputs. Verwenden Sie WinDebug die Spur zu sehen, wie das Programm ausgeführt wird. (Put irgendeine Form von Kontrolle in Ihrer Klasse, auch wenn es nur eine globale Variable oder Registrierungswert oder globales Atom, so dass Sie das Tracing ein- oder ausgeschaltet nach Belieben drehen können).
Es stürzt bei seltenen Gelegenheiten. Ich war auf der Suche nach einer Möglichkeit, den Namen des Anrufers zu erhalten und melden Sie es.
Was meinst du stürzt? Zugriffsverletzung? Geteilt durch Null? was genau? Ist es mit Kernel-Modus-Komponenten interagieren?
Schalten Sie AppVerifier. das sollte eine Menge Dinge beseitigen.
erstellen folgt aus:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ Currentversion \ Image File Execution Options \ FileName.exe
unter diesem Schlüssel erstellen Sie eine neue Zeichenfolge Name: Debugger Wert: c: \ pathtowindbg \ windbg.exe -GG -xe av
Wenn Sie 32-Bit-Code mit WOW laufen lassen, müssen Sie dies unter der wow3264node tun.