Как проанализировать файл 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 ответов:
вы можете использовать ядро с 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 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