GDB 无法读取它生成的核心文件

Posted

技术标签:

【中文标题】GDB 无法读取它生成的核心文件【英文标题】:GDB is not able to read the core file it produced 【发布时间】:2020-03-30 08:04:14 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

gdb my_program.exe -c core.pid

【讨论】:

以上是关于GDB 无法读取它生成的核心文件的主要内容,如果未能解决你的问题,请参考以下文章

尝试将 /proc/kallsyms 添加到 gdb 以进行 vmlinux 调试:`/proc/kallsyms':无法读取符号:文件格式无法识别

(gdb) gcore gcore 警告:内存读取失败

是否可以调试由没有 gdb 标志编译的可执行文件生成的核心文件?

gdb 调试远程核心转储

GDB C++ 出错时无法获取源核心行(分段错误)

无法理解核心文件分析的 GDB x 命令输出