首页 > 解决方案 > GDB 无法读取它生成的核心文件

问题描述

我正在在 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 在重新加载核心转储时无法找到函数名。有什么提示吗?

标签: gdbcoredumparm64

解决方案


就像操作系统创建一个核心文件一样,核心文件本身并不包含原始程序可执行文件,而正是这个可执行文件包含了调试信息(或允许 GDB 找到调试信息)。

这意味着,如果您想使用调试信息进行调试,那么您需要同时提供可执行文件和核心文件,例如:

gdb my_program.exe -c core.pid

推荐阅读