从Core Dump读取CPU寄存器时GDB报文件格式不识别的原因
解决GDB读取Core Dump时的"file format not recognized"错误
先还原下你的场景:你写了一个循环打印信息的C程序:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> void main(){ char *variable = "CodeName0..."; while (1){ printf("%s\n%d\n","hello from gencore code source",getpid()); sleep(2); } exit(0); }
运行后用kill -6 <进程ID>发送SIGABRT生成了core文件,但用GDB查看时弹出了"0x7fffd7f6de10s": not in executable format: file format not recognized的错误,没法读取CPU寄存器内容。
错误原因
这个报错几乎都是因为GDB的启动参数顺序错了——你可能直接把core文件当成可执行程序来加载了(比如输入gdb core),或者把core文件和程序文件的顺序搞反了。GDB需要先知道对应的可执行程序,再加载core dump文件,否则它没法解析core里的内容。
正确的操作步骤
先确保程序编译时带调试信息(可选但推荐)
重新编译程序时加上-g参数,这样GDB能显示更清晰的调试信息:gcc -g your_program.c -o your_program(把
your_program换成你实际的程序名称)用GDB正确加载程序和core文件
执行以下命令,先指定可执行程序,再指定core文件:gdb ./your_program core查看寄存器内容
进入GDB后,输入以下命令查看所有寄存器:info registers在x86_64架构的系统上,你要找的IP寄存器对应的是
rip,也可以单独查看它:info rip
额外排查点
- 检查core文件是否正常生成:执行
file core,如果输出显示类似core: core file from './your_program',说明文件没问题;如果显示不是core文件,可能是系统限制了core文件大小——执行ulimit -c查看,若输出为0,说明被禁用了,执行ulimit -c unlimited就能允许生成无限制大小的core文件。 - 确认GDB架构匹配:你的系统是x86_64,执行
gdb --version,确认输出里有x86_64字样,避免装成32位GDB导致不兼容。
内容的提问来源于stack exchange,提问作者Djebarra Rabah Abderrazak
相关产品推荐
相关产品推荐

