2009-12-18 8 views
12

Ist es unter keinen Umständen möglich, den Status eines Programms so wiederherzustellen, wie es während der Generierung einer Core-Datei war?Wiederherstellen des Programmstatus aus einer Core-Datei

Der Grund, warum ich frage, ist, dass, um gdb's Fähigkeit, Funktionen auszuführen, und so weiter nutzen müssen Sie eine laufende Instanz haben. Sicherlich sollte es möglich sein, einen Scheinprozess der gleichen ausführbaren Datei mit dem Status zu erstellen, der als der Inhalt des Kerns festgelegt wird?

Wenn nicht, welche Alternativen gibt es für die Art von Situation, die mich dazu gebracht hat, dies überhaupt zu tun? In diesem Fall führte die Rückverfolgung des Kerns zu einer Bibliotheksfunktion, und ich wollte die Eingaben zu diesem Funktionsaufruf replizieren, aber eine der Eingaben war ein komplexes Objekt, das leicht zu einer Zeichenkette mit einem Funktionsaufruf in einem Lauf serialisiert werden konnte Instanz, aber nicht so in einem Core-Dump.

Antwort

7

Es ist theoretisch möglich, genau das zu tun, was Sie wollen, aber (AFAICT) gibt es keine Unterstützung dafür in GDB (noch).

Verwenden Sie am besten GDB-7.0 und verwenden Sie das eingebettete Python-Scripting, um die Serialisierungsfunktion erneut zu implementieren.

+0

Danke - ich weiß nicht, ob Python Scripting in der Lage ist zu tun, was ich will, aber es klingt trotzdem sehr nützlich. – cyborg

2

Das macht eine Core-Datei schon? Wenn Sie gdb mit der ursprünglichen ausführbaren Datei laden und die Kerndatei

gdb myprogram.exe -c mycorefile 

Dann wird es an den Punkt gehen, wo es abgestürzt ist. Sie können alle normalen Inspektionsfunktionen verwenden, um die Variablen anzuzeigen, den Stack-Trace zu sehen und so weiter.

Oder habe ich Ihre Frage missverstanden?

+3

Sie können Funktionen in gdb nicht ausführen, wenn Sie eine Kerndatei debuggen. Also sagen, ich habe eine Core-Datei, finde eine Variable einer komplexen Klasse Foo und ich möchte Foo.getSerialization() ausführen, um eine nette einfache String-Darstellung zu erhalten, kann ich nicht, weil es kein laufender Prozess ist. Die Frage ist also, kann man vom Kern zu einem laufenden Prozess gehen. – cyborg

+1

Sie können etwas Code schreiben, um gdb schöne Druckwerte zu machen. Siehe die Python API hier (http://sourceware.org/gdb/current/onlinedocs/gdb/Python-API.html#Python-API). –

+0

@JeffFoster Ich denke, es ist wirklich nicht hilfreich, wenn Sie irgendeine Live-Funktion aufrufen möchten, ist es einfach nicht möglich. –