Wie kann ich analysieren ein Programm auf die core-dump-Datei mit GDB, wenn es command-line-Parameter?
Mein Programm arbeitet so:
exe -p param1 -i param2 -o param3
Knallte es und erzeugt einen core-dump-Datei core.pid
.
Möchte ich analysieren, die core-dump-Datei
gdb ./exe -p param1 -i param2 -o param3 core.pid
Aber GDB erkennt die Parameter der EXE-Datei als GDB-Eingang.
Wie kann ich analysieren, einen core-dump-Datei in dieser situation?
- Sind Sie sicher, dass Ihre
exe
ist nicht ein shell-Skript (um einige Variablen, etc..), wie zBfirefox
ist auf Linux?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie den Kern mit gdb in vielerlei Hinsicht, aber die übergabe von Parametern, die übergeben werden, um die ausführbare Datei für den gdb ist nicht die Art, wie der core-Datei. Dies könnte auch der Grund sein, haben Sie die Fehler. Sie können verwenden Sie die core-Datei in der folgenden Weise:
gdb <executable> <core-file>
odergdb <executable> -c <core-file>
oderBei Verwendung von core-Datei, die Sie nicht haben, um Argumente übergeben werden. Das crash-Szenario gezeigt wird in gdb (geprüft mit gdb in der Version 7.1 unter Ubuntu) .
Zum Beispiel:
Wenn Sie möchten, um Parameter an die ausführbare Datei zum Debuggen in gdb verwenden
--args
.Zum Beispiel:
Mann Seiten wird hilfreich sein, um zu sehen, andere gdb Optionen.
Einfache Benutzung von GDB zum Debuggen coredump-Dateien:
Coredump-Datei für einen "Vorgang" angelegt wird, als "Kern.pid" - Datei.
Nachdem Sie in die gdb-Eingabeaufforderung (bei der Ausführung des obigen Befehls), geben;
Diese erhalten Sie mit den Informationen auf dem stack, wo Sie analayze die Ursache für Absturz/Fehler.
Anderen Befehl, für gleiche Zwecke;
Dies ist dasselbe wie oben. Durch Konvention, listet er die ganzen Stapel info (die letztlich zu dem Absturz-Ort).
Überspringen Sie einfach die params, gdb braucht Sie nicht:
Vom RMS ist der gdb-Debugger-Tutorial:
Stellen Sie sicher, dass die Datei wirklich eine
core
Bild -- überprüfen Sie es mitfile
.Einen etwas anderen Ansatz erlauben wird, Sie zu überspringen GDB vollständig. Wenn alles, was Sie wollen, ist ein backtrace, die linux-spezifische utility 'catchsegv' fangen SIGSEGV und display ein backtrace.
objdump
+gdb
minimal lauffähigen BeispielTL;DR:
objdump -s core
dump memoryGDB zu finden, scheitern Linie, zuvor erwähnt: Wie kann ich analysieren ein Programm auf die core-dump-Datei mit GDB, wenn es command-line-Parameter?
Jetzt für das gesamte Bildungs-test-setup:
main.c
Kompilieren und ausführen zu generieren core:
Ausgabe:
GDB stellen Sie uns die genaue Zeile, wo der segfault passiert ist, was die meisten Nutzer wollen beim Debuggen:
dann:
die Punkte, die uns direkt in die buggy Linie 7.
Binutils Analyse
Erste:
sagt uns, dass die
core
- Datei ist eigentlich eine ELF-Datei:weshalb wir in der Lage sind, zu inspizieren, um es direkt mit den üblichen binutils-tools.
Einen schnellen Blick auf die ELF standard zeigt, dass es eigentlich ein ELF-Typ, um es gewidmet:
Weiteren Informationen zum format finden Sie unter:
Dann:
gibt einige Hinweise über die Datei-Struktur. Erinnerung erscheint, enthalten sein in regelmäßige Programm-Header:
und es gibt einige mehr Metadaten vorhanden in einer notes-Bereich. Vor allem, ich denke, der PC muss da sein (TODO bestätigen):
objdump
können ganz einfach sichern Sie alle Speicher mit:enthält:
passt genau mit dem stdout-Wert in unserem Lauf.
Getestet in Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
Ist es egal, ausführbare Argumente haben oder nicht, Zu GDB auf alle binäre mit einem generierten core-Datei, die Syntax ist unten.
lassen Sie mich nehmen Sie das folgende Beispiel für mehr Verständnis.
Aus der obigen Ausgabe können Sie sich vorstellen, etwas über core, ob es ein NULL-Zugriff oder SIGABORT etc..
Diese Nummern #0 bis #10 werden die stack-frames der GDB. Diese stack-frames nicht Ihre binäre. in der oben 0 - 10 frames wenn Sie vermuten, dass etwas falsch wählen, dass der Rahmen
Nun zu sehen, mehr details über ihn:
Problem weiter zu untersuchen, können Sie drucken die vermutete variable Werte hier an diesem Punkt der Zeit.
Können Sie analysieren die core-dump-Datei mit "gdb" - Befehl.
Dank.
Geben Sie einfach den Befehl
oder
Keine Notwendigkeit, irgendeine Befehl Linie argument. Der code dump erzeugt durch frühere übung.