我正在Yocto / ARM64(iMX8QM)上运行的大型应用程序上调试SIGSEGV错误。
如果我在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在重装核心转储时找不到函数名称。有提示吗?
就像操作系统创建核心文件时一样,原始程序可执行文件不包含在核心文件本身中,而包含调试信息(或允许GDB查找调试信息的正是该可执行文件。)>
这是什么意思,如果您想使用调试信息进行调试,则需要同时提供可执行文件和核心文件,因此类似:
gdb my_program.exe -c core.pid