text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
GDB указывает нам на точную линию, где произошел segfault, что большинство пользователей хотят при отладке:
gdb -q -nh main.out core
тогда:
Reading symbols from main.out...done.
[New LWP 27479]
Core was generated by `./main.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
7 *(int*)(NULL) = i;
(gdb) bt
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
#1 0x000000000040072b in main (argc=1, argv=0x7ffec6739328) at main.c:28
который указывает нам прямо на глючную линию 7.
Анализ Binutils
Первый:
file core
говорит нам, что coreфайл на самом деле является файлом ELF:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
именно поэтому мы можем проверить это непосредственно с помощью обычных инструментов binutils.
Беглый взгляд на стандарт ELF показывает, что на самом деле ему выделен тип ELF:
Elf32_Ehd.e_type == ET_CORE
Дополнительную информацию о формате можно найти по адресу:
man 5 core
Затем:
readelf -Wa core
дает некоторые подсказки о структуре файла. Кажется, что память содержится в обычных заголовках программы:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
NOTE 0x000468 0x0000000000000000 0x0000000000000000 0x000b9c 0x000000 0
LOAD 0x002000 0x0000000000400000 0x0000000000000000 0x001000 0x001000 R E 0x1000
LOAD 0x003000 0x0000000000600000 0x0000000000000000 0x001000 0x001000 R 0x1000
LOAD 0x004000 0x0000000000601000 0x0000000000000000 0x001000 0x001000 RW 0x1000
и в области заметок есть еще несколько метаданных. Примечательно, что компьютер должен быть там (подтверждение TODO):
GDB - это отладчик GNU, который можно использовать для проверки файла ядра. BTW bt(backtrace) - полезная команда gdb для проверки стека вызовов программы.
Ответы:
objdump
+gdb
минимальный работоспособный примерTLDR:
objdump -s core
сбросить памятьGDB, чтобы найти ошибочную строку, ранее упоминавшуюся по адресу: Как просмотреть файлы ядра для целей отладки в Linux?
Теперь для полной образовательной настройки теста:
main.c
Скомпилируйте и запустите для генерации ядра:
Выход:
GDB указывает нам на точную линию, где произошел segfault, что большинство пользователей хотят при отладке:
тогда:
который указывает нам прямо на глючную линию 7.
Анализ Binutils
Первый:
говорит нам, что
core
файл на самом деле является файлом ELF:именно поэтому мы можем проверить это непосредственно с помощью обычных инструментов binutils.
Беглый взгляд на стандарт ELF показывает, что на самом деле ему выделен тип ELF:
Дополнительную информацию о формате можно найти по адресу:
Затем:
дает некоторые подсказки о структуре файла. Кажется, что память содержится в обычных заголовках программы:
и в области заметок есть еще несколько метаданных. Примечательно, что компьютер должен быть там (подтверждение TODO):
objdump
может легко сбросить всю память с помощью:который содержит:
который точно соответствует значению stdout в нашем прогоне.
Протестировано в Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
источник
GDB - это отладчик GNU, который можно использовать для проверки файла ядра. BTW
bt
(backtrace) - полезная команда gdb для проверки стека вызовов программы.источник
При компиляции программы используйте опцию -g
gcc -g program.c
Если основной файл создан, то вы можете отлаживать его с помощью GDB без использования опции -g. Отладочные флаги не будут включены.
источник
Если вы предпочитаете использовать инструмент командной строки, тогда вы можете использовать gdb :
или
Если вам нравится GUI, то установите DDD , и оттуда откройте программу для отладки и файл ядра.
источник
источник