GDB调试器使用指南 - 来自awesome-cheatsheets项目的精华总结
前言
GDB(GNU Debugger)是Linux环境下最强大的调试工具之一,对于开发者而言掌握GDB的使用技巧至关重要。本文将基于awesome-cheatsheets项目中的GDB速查表,系统性地介绍GDB的各类实用命令和调试技巧,帮助开发者快速掌握这一强大工具。
一、GDB基础入门
1.1 启动GDB
GDB有多种启动方式,适用于不同调试场景:
gdb 可执行文件 # 调试普通可执行程序
gdb 可执行文件 core文件 # 调试崩溃后的core dump文件
gdb -p 进程ID # 附加到正在运行的进程进行调试
gdb -tui # 启动文本用户界面(TUI)模式
启动后,可以使用file
命令手动加载可执行文件。TUI模式提供了源代码和汇编代码的并行显示,非常适合调试复杂问题。
1.2 获取帮助
GDB内置了完善的帮助系统:
help # 显示所有命令分类
help running # 查看运行相关命令帮助
help breakpoints # 查看断点相关命令帮助
二、断点管理
2.1 设置断点
断点是调试的核心功能,GDB提供了多种设置方式:
break main # 在main函数入口设置断点
break 101 # 在当前文件的101行设置断点
break basic.c:foo # 在指定文件的foo函数设置断点
break *0x00400448 # 在内存地址设置断点
2.2 断点管理命令
info breakpoints # 查看所有断点信息
delete 2 # 删除2号断点
disable 3 # 暂时禁用3号断点
enable 3 # 重新启用3号断点
2.3 高级断点功能
watch variable # 监视变量变化
rbreak regex # 使用正则表达式设置断点
condition 1 i>10 # 为1号断点设置条件(i>10时触发)
三、程序执行控制
3.1 基本执行命令
run # 启动程序执行
continue # 继续执行到下一个断点
step # 单步进入(会进入函数内部)
next # 单步跳过(不进入函数)
finish # 执行完当前函数并暂停
3.2 参数设置
set args arg1 arg2 # 设置程序启动参数
show args # 显示当前参数设置
四、数据查看与分析
4.1 变量查看
print variable # 打印变量值
print /x variable # 十六进制格式打印
x/10xb &array # 以十六进制字节格式查看数组前10个元素
4.2 类型信息
ptype struct_var # 查看结构体定义
whatis expression # 查看表达式类型
4.3 栈帧分析
bt # 打印调用栈(backtrace)
frame # 显示当前栈帧
up # 向上移动栈帧
down # 向下移动栈帧
五、多线程与多进程调试
5.1 线程调试
info threads # 查看所有线程
thread 2 # 切换到2号线程
break main thread all # 在所有线程的main函数设置断点
5.2 进程调试
info inferiors # 查看所有进程
inferior 2 # 切换到2号进程
set follow-fork-mode child # 跟踪子进程
六、汇编级调试
对于需要深入分析的问题,可以进行汇编级调试:
disassemble main # 反汇编main函数
stepi # 单步执行一条机器指令
info registers # 查看寄存器内容
x/i $pc # 查看当前指令
七、实用技巧
- 命令历史:直接按回车会重复执行上一条命令
- 定义宏:使用
define
命令可以创建自定义命令组合 - shell命令:在GDB中可以使用
shell
执行外部命令 - 脚本化调试:使用
source
命令加载预先编写的调试脚本
八、图形界面工具
虽然GDB本身是命令行工具,但有许多图形前端可用:
- GDB TUI:内置的文本界面(启动时加
-tui
参数) - CGDB:基于终端的图形前端
- GDBGUI:基于Web的图形界面
结语
GDB是一个功能极其强大的调试工具,本文仅涵盖了其核心功能。实际调试时,建议结合help
命令探索更多高级功能。掌握GDB可以显著提高调试效率,是每个Linux开发者必备的技能。
记住:调试是一门艺术,而GDB是你最好的画笔。随着使用经验的积累,你会逐渐发现更多高效的使用技巧,让调试过程变得更加得心应手。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考