利用gdb对core dump文件进行debug
利用gdb对core dump文件进行debug
内容
通过 GDB 调试 Core Dump 文件可以快速定位程序崩溃的原因。以下是详细步骤:
1. 确保 Core Dump 已生成且可访问
-
检查系统是否允许生成 Core Dump
终端输入ulimit -c,若返回0,需临时解除限制:ulimit -c unlimited # 当前会话生效永久生效需在
/etc/security/limits.conf中添加:* soft core unlimited -
查找 Core Dump 文件路径
默认路径通常是程序崩溃时的运行目录,可通过以下命令查看系统配置:sysctl kernel.core_pattern # Linux
2. 准备调试环境
-
编译时添加调试符号
确保程序编译时启用了-g选项(保留调试信息):g++ -g -o my_program my_program.cpp # C++ 示例 -
确认可执行文件与 Core 文件匹配
如果程序在崩溃后重新编译过,旧 Core 文件将无法调试。
3. 使用 GDB 加载 Core 文件
gdb <可执行文件路径> <Core文件路径>
示例:
gdb ./my_program ./core.1234
4. 分析崩溃原因
-
查看堆栈跟踪(Backtrace)
输入bt或backtrace查看崩溃时的调用栈:(gdb) bt #0 0x00007f8e9d4d25f7 in raise () from /lib64/libc.so.6 #1 0x00007f8e9d4d3ce8 in abort () from /lib64/libc.so.6 #2 0x000055d5c3d4012a in main () at my_program.cpp:10 -
定位具体代码行
使用frame <编号>切换到具体的堆栈帧,再结合list查看代码:(gdb) frame 2 (gdb) list 8 int* ptr = nullptr; 9 *ptr = 42; // 空指针解引用导致崩溃 10 } -
检查变量值
使用print或p查看变量:(gdb) p ptr $1 = (int *) 0x0 # 空指针
5. 高级调试命令
-
查看线程状态
输入info threads查看所有线程状态:(gdb) info threads Id Target Id Frame * 1 Thread 0x7f8e9d... (LWP 1234) main () at my_program.cpp:10 -
查看寄存器值
输入info registers查看 CPU 寄存器:(gdb) info registers rax 0x0 0 rbx 0x7ffd... 140726... -
反汇编代码
输入disassemble查看当前函数的汇编指令:(gdb) disassemble Dump of assembler code for function main: 0x000055d5c3d40110 <+0>: push %rbp 0x000055d5c3d40111 <+1>: mov %rsp,%rbp ...
6. 常见问题处理
-
错误:
No such file or directory
可执行文件或 Core 文件路径错误,或编译时未添加-g。 -
错误:
Core was generated by ...不匹配
可执行文件已被重新编译,需使用与 Core 文件匹配的旧版本。 -
无符号信息
编译时未启用-g或调试符号被剥离(如strip命令)。
7. 自动化调试(可选)
将常用命令写入脚本(如 debug_script.gdb):
# debug_script.gdb
bt
frame 2
info locals
通过 -x 参数批量执行:
gdb -x debug_script.gdb ./my_program ./core.1234
通过以上步骤,你可以快速定位程序崩溃的位置和原因(如空指针、内存越界等)。如果需要进一步分析,可以结合 Valgrind 或 AddressSanitizer 等工具检查内存问题。

浙公网安备 33010602011771号