GDB не может прочитать созданный файл ядра - PullRequest
0 голосов
/ 30 марта 2020

Я отлаживаю ошибку SIGSEGV на огромном приложении, работающем на Yocto / ARM64 (iMX8QM).

Если я запускаю приложение в GDB, я могу получить обратную трассировку:

Thread 1 "HmiAppCentral" received signal SIGSEGV, Segmentation fault.                                   
0x0000000000b0a0d0 in kanzi::Node3D::~Node3D() ()                                                       
(gdb) bt                                                                                                
#0  0x0000000000b0a0d0 in kanzi::Node3D::~Node3D() ()                                                   
#1  0x0000000000cd4e44 in kanzi::Model3D::~Model3D() ()                                                 
#2  0x0000000000b09c38 in kanzi::Node3D::removeChild(unsigned long) ()
[...]

Затем я экспортирую дамп основной памяти, выхожу из GDB и перезапускаю его:

(gdb) generate-core-file                                                                                
warning: target file /proc/2279/cmdline contained unexpected null characters
[...]
gdb -c core.2279

Затем GDB больше не может печатать обратную трассировку:

(gdb) bt full
#0  0x0000000000b0a0d0 in ?? ()
No symbol table info available.
#1  0x0000000000000001 in ?? ()
No symbol table info available.
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Адрес первого кадра является правильным (0x0000000000b0a0d0), однако GDB не может найти имя функции при перезагрузке дампа памяти. Любой намек?

1 Ответ

0 голосов
/ 30 марта 2020

Так же, как когда ОС создает файл ядра, исходный исполняемый файл программы не включается в сам файл ядра, и именно этот исполняемый файл содержит информацию об отладке (или позволяет GDB находить информацию об отладке).

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

gdb my_program.exe -c core.pid
...