Der Core-Dump ist nur der Dump des Speicherbedarfs Ihres Programms. Wenn Sie wissen, wo sich alles befindet, können Sie ihn einfach verwenden.
Sie verwenden die ausführbare Datei, weil sie erklärt, wo sich (in Bezug auf logische Adressen) Dinge im Speicher befinden, dh in der Kerndatei.
Wenn Sie einen Befehl verwenden objdump
, werden die Metadaten des ausführbaren Objekts, das Sie untersuchen, ausgegeben. Verwenden Sie als Beispiel ein ausführbares Objekt mit dem Namen a.out.
objdump -h a.out
Gibt nur die Header-Informationen aus. Es werden Abschnitte mit dem Namen z. .data oder .bss oder .text (es gibt noch viel mehr). Diese informieren den Kernel-Loader darüber, wo im Objekt verschiedene Abschnitte zu finden sind und wo im Prozessadressraum der Abschnitt geladen werden soll und für einige Abschnitte (z. B. .data .text), was geladen werden soll. (Der Abschnitt .bss enthält keine Daten in der Datei, bezieht sich jedoch auf die Speichermenge, die im Prozess für nicht initialisierte Daten reserviert werden muss. Er ist mit Nullen gefüllt.)
Das Layout der ausführbaren Objektdatei entspricht einem Standard-ELF.
objdump -x a.out
- wirft alles weg
Wenn das ausführbare Objekt noch seine Symboltabellen enthält (es wurde nicht entfernt - man strip
und Sie haben -g
die Debug-Generierung generiert, um die gcc
Kompilierung der Wechselstromquelle anzunehmen), können Sie den Kerninhalt anhand von Symbolnamen untersuchen, z. B. wenn Sie eine Variable / einen Puffer hatten Mit dem Namen inputLine in Ihrem Quellcode können Sie diesen Namen verwenden gdb
, um den Inhalt anzuzeigen . Das heißt gdb
, Sie kennen den Versatz vom Beginn Ihres vom Programm initialisierten Datensegments, in dem inputLine beginnt, und die Länge dieser Variablen.
Lesen Sie weiter Artikel 1 ,
Artikel 2 und die ELF-Spezifikation (Executable and Linking Format) .
Update nach @mirabilos Kommentar unten.
Aber wenn Sie die Symboltabelle wie in verwenden
$ gdb --batch -s a.out -c core -q -ex "x buf1"
Produziert
0x601060 <buf1>: 0x72617453
und dann nicht die Symboltabelle verwenden und die Adresse direkt in untersuchen,
$ gdb --batch -c core -q -ex "x 0x601060"
Produziert
0x601060: 0x72617453
Ich habe den Speicher direkt untersucht, ohne die Symboltabelle im 2. Befehl zu verwenden.
Ich sehe auch, dass die Antwort von @ user580082 die Erklärung weiter erweitert und die Abstimmung verbessern wird.