gdb - 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 在重新加载核心转储时无法找到函数名。有什么提示吗?
解决方案
就像操作系统创建一个核心文件一样,核心文件本身并不包含原始程序可执行文件,而正是这个可执行文件包含了调试信息(或允许 GDB 找到调试信息)。
这意味着,如果您想使用调试信息进行调试,那么您需要同时提供可执行文件和核心文件,例如:
gdb my_program.exe -c core.pid
推荐阅读
- bash - 转义字符如何在 bash 引用中工作?
- encryption - VSCode:打开时解密,保存时加密
- google-analytics - 在单个操作中向谷歌分析发送多个事件的最佳选择是什么?
- aws-glue - 具有所需输出列名称的 AWS Glue 简单自定义转换
- apache-spark - 无法使用 Apache Hudi 写入非分区表
- reactjs - 无法从后端 API 检索授权标头
- spring - 如何从内部测试访问默认静态内部类
- awk - 在多个文件中查找模式并对它们执行一些操作
- mysql - sql条件至少有一个子项是状态成功
- performance - 如何提高 Julia the Storkey 的学习表现?