GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie analysiere ich die Core-Dump-Datei eines Programms mit GDB, wenn sie Befehlszeilenparameter enthält?

Sie können den Kern mit GDB auf viele Arten verwenden, aber das Übergeben von Parametern, die an die ausführbare Datei an GDB übergeben werden sollen, ist nicht der Weg, um die Kerndatei zu verwenden. Dies könnte auch der Grund sein, warum Sie diesen Fehler erhalten haben. Sie können die Kerndatei auf folgende Weise verwenden:

gdb <executable> <core-file> oder gdb <executable> -c <core-file> oder

gdb <executable>
...
(gdb) core <core-file>

Wenn Sie die Core-Datei verwenden, müssen Sie keine Argumente übergeben. Das Absturzszenario wird in GDB angezeigt (geprüft mit GDB Version 7.1 auf Ubuntu).

Zum Beispiel:

$ ./crash -p param1 -o param2
Segmentation fault (core dumped)
$ gdb ./crash core
GNU gdb (GDB) 7.1-ubuntu
...
Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario
Program terminated with signal 11, Segmentation fault.
#0  __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

Wenn Sie Parameter an die zu debuggende ausführbare Datei in GDB übergeben möchten, verwenden Sie --args .

Zum Beispiel:

$ gdb --args ./crash -p param1 -o param2
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) r
Starting program: /home/@@@@/crash -p param1 -o param2

Program received signal SIGSEGV, Segmentation fault.
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

Manpages sind hilfreich, um andere GDB-Optionen zu sehen.


Einfache Verwendung von GDB, um Coredump-Dateien zu debuggen:

gdb <executable_path> <coredump_file_path>

Eine Coredump-Datei für einen „Prozess“ wird als „core.pid“-Datei erstellt.

Nachdem Sie in die GDB-Eingabeaufforderung gelangt sind (bei Ausführung des obigen Befehls), geben Sie Folgendes ein:

...
(gdb) where

Dadurch erhalten Sie die Informationen des Stacks, wo Sie die Ursache des Absturzes/Fehlers analysieren können.Anderer Befehl, für die gleichen Zwecke ist:

...
(gdb) bt full

Dies ist das gleiche wie oben. Üblicherweise listet es die gesamten Stack-Informationen auf (was letztendlich zur Absturzstelle führt).


Überspringen Sie einfach die Parameter. GDB braucht sie nicht:

gdb ./exe core.pid

Linux
  1. Wie werden Parameter eingestellt, wenn Bash-Skript an Bash übergeben wird?

  2. Wie man ein C-Programm mit gdb in 6 einfachen Schritten debuggt

  3. Wie schreibe ich eine Datei mit C in Linux?

  4. Wie kann ich beim Lesen einer Datei mit „weniger“ oder „mehr“ den Inhalt in Farbe erhalten?

  5. Wie fülle ich eine Datei mit FF mit dd auf?

So verwenden Sie den Linux-rm-Befehl mit Beispielen

So beheben Sie Konvertierungsfehler mit Calibre

So laden Sie .bash_profile in der Linux-Befehlszeile neu

So gehen Sie Dateinamen mit Leerzeichen in Linux an

Wann wird eine mit mkstemp() erstellte Datei gelöscht?

Wie lösche ich .fuse_hidden*-Dateien?