在Linux系统中使用gdb调试一个代码
发布时间:2025-07-31 00:08       
以下是在Linux系统中使用GDB调试代码的专业指南,结合最新实践和核心调试技术,确保实用性和准确性:
一、环境准备
-
安装GDB
sudo apt install gdb # Debian/Ubuntu sudo yum install gdb # CentOS/RHEL📌 验证安装:
gdb --version(当前稳定版为13.2) -
编译带调试信息的代码
gcc -g -O0 -o my_program my_program.c # -g 包含调试符号,-O0 禁用优化🔍 关键:无
-g则无法查看源码和变量。
二、核心调试流程
1. 启动GDB
gdb ./my_program # 加载可执行文件
2. 设置断点(Breakpoints)
| 命令 | 作用 |
|---|---|
break main |
在main函数入口设断点 |
break file.c:20 |
在file.c第20行设断点 |
break func_name |
在特定函数处设断点 |
info breakpoints |
查看所有断点 |
delete [编号] |
删除断点 |
3. 运行程序
run arg1 arg2 # 传递命令行参数
start # 停在main函数第一行(临时断点)
4. 逐行执行
| 命令 | 区别 |
|---|---|
next(n) |
执行下一行(跳过函数调用) |
step(s) |
执行下一行(进入函数内部) |
continue(c) |
继续运行直到下一个断点 |
5. 查看数据
print variable # 打印变量值
print *(array+5) # 查看数组第6个元素
display variable # 每次暂停时自动打印该变量
info locals # 显示当前栈帧所有局部变量
6. 检查调用栈
backtrace (bt) # 显示调用栈
frame [编号] # 切换到指定栈帧
up/down # 在栈帧间上下移动
三、高级调试技巧
1. 条件断点
break 30 if count > 100 # 当count>100时在第30行暂停
2. 观察点(Watchpoints)
watch variable # 当变量被修改时暂停
rwatch variable # 当变量被读取时暂停
3. 修改运行时数据
set variable = 10 # 修改变量值(用于绕过错误逻辑测试)
4. 多线程调试
info threads # 查看所有线程
thread [ID] # 切换到指定线程
break line thread all # 在所有线程的某行设断点
四、实战案例:调试段错误(Segmentation Fault)
- 启用核心转储:
ulimit -c unlimitedecho "core" > /proc/sys/kernel/core_pattern - 运行程序触发崩溃后,用GDB分析:
gdb ./my_program core # 加载程序和核心转储文件 - 定位问题:
backtrace # 查看崩溃时的调用栈info registers # 检查寄存器值(特别是eip/rip)x/10x $sp # 查看栈内存
五、常用辅助命令
| 命令 | 用途 |
|---|---|
list(l) |
显示源码(可带行号/函数名) |
info proc mappings |
查看进程内存映射 |
disassemble |
反汇编当前函数 |
quit(q) |
退出GDB |
六、提高效率的技巧
-
使用
.gdbinit配置文件
在~/.gdbinit中添加常用设置:set pagination off # 禁用分页 set history save on # 保存命令历史 -
TUI模式(文本用户界面)
gdb -tui ./my_program # 同时显示源码和汇编📌 快捷键:
Ctrl+X+A切换TUI模式 -
配合Valgrind检测内存错误
valgrind --leak-check=full ./my_program
七、常见问题解决
- 断点不生效 → 检查编译时是否包含
-g,优化级别是否过高(建议-O0) - 变量值显示
<optimized out>→ 重新用-O0编译 - 动态库调试 → 用