Как проанализировать файл core dump программы с gdb?


моя программа работает так:

exe -p param1 -i param2 -o param3

Он разбился и сгенерировал файл дампа ядра core.pid

Я хочу проанализировать файл дампа ядра с помощью

gdb ./exe -p param1 -i param2 -o param3 core.pid 

но gdb распознает параметры exe в качестве входных данных высокоточная.

как анализировать файл дампа ядра в этой ситуации?

8 108

8 ответов:

вы можете использовать ядро с gdb во многих отношениях, но передача параметров, которые должны быть переданы исполняемому файлу в gdb, не является способом использования основного файла. Это также может быть причиной вы получили эту ошибку. Вы можете использовать основной файл следующим образом:
gdb <executable> <core-file> или gdb <executable> -c <core-file> или

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

при использовании основного файла вам не нужно передавать аргументы. Сценарий сбоя показан в gdb (проверено с GDB версии 7.1 на Ubuntu) . Например:

$ ./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) 

если вы хотите передавать параметры в исполняемый файл для отладки в GDB использовать --args.
Например:

$ 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) 

Man-страницы будут полезны для просмотра других параметров gdb.

простое использование GDB, для отладки файлов coredump:

gdb <executable_path> <coredump_file_path>

файл Coredump для" процесса "создается как "ядро".пид " файл. После того, как вы попадете внутрь gdb-prompt, (при выполнении вышеуказанной команды), введите;

...
(gdb) where

Это поможет вам с информацией, стека, где вы можете проанализировать причину аварии/неисправности. другой команде для тех же целей;

...
(gdb) bt full

Это то же самое, что и выше. По соглашению, в нем перечислены все информация о стеке (что в конечном итоге приводит к месту аварии).

просто пропустите параметры, gdb не нуждается в них:

gdb ./exe core.pid

С учебник по отладчику gdb RMS:

prompt > myprogram
Segmentation fault (core dumped)
prompt > gdb myprogram
...
(gdb) core core.pid
...

убедитесь, что ваш файл действительно является core изображение -- проверьте его с помощью file.

немного другой подход позволит вам полностью пропустить GDB. Если все, что вы хотите-это след, в Linux утилита catchsegv будет отлавливать сигнала SIGSEGV и отображение обратного сигнала.

не имеет значения, есть ли у исполняемого файла аргументы или нет, чтобы запустить GDB на любом двоичном файле с сгенерированным синтаксисом основного файла ниже.

Syntax: 
gdb <binary name> <generated core file>    
Eg: 
gdb l3_entity 6290-corefile    

позвольте мне взять пример ниже для большего понимания.

bash-4.1$**gdb l3_entity 6290-corefile**

**Core was generated** by `/dir1/dir2/dir3/l3_entity **Program terminated with signal SIGABRT, Aborted.**
#0
#1
#2
#3
#4
#5
#6  
#7  
#8  
#9  
#10 
(gdb)

из приведенного выше вывода вы можете догадаться что-то о ядре, является ли это нулевым доступом или SIGABORT и т. д..

эти числа #0 до #10 являются кадрами стека GDB. Эти кадры стека не относятся к вашему двоичному файлу. в вышеуказанных 0-10 кадрах, если вы подозреваю, что что-то не так выберите этот кадр

(gdb) frame 8 

теперь, чтобы увидеть более подробную информацию об этом:

(gdb) list + 

чтобы исследовать проблему дальше, вы можете распечатать предполагаемые значения переменных здесь в этот момент времени.

(gdb) print thread_name 

вы можете проанализировать файл дампа ядра с помощью команды "gdb".

 gdb - The GNU Debugger

 syntax:

 # gdb executable-file core-file

 ex: # gdb out.txt core.xxx 

спасибо.

просто введите команду

$ gdb <Binary> <codeDump>

или

$ gdb <binary>

$ gdb) core <coreDump>

нет необходимости предоставлять какие-либо аргументы командной строки. Дамп кода, созданный из-за более раннего упражнения.