
1. GDB简介GDBGNU Debugger是GNU项目开发的功能强大的调试器支持多种编程语言包括C、C、Fortran等。GDB可以帮助开发者查看程序的执行状态设置断点和观察点单步执行程序检查变量和内存分析程序崩溃原因进行远程调试2. 基本启动命令2.1 启动GDB# 直接启动GDB gdb # 启动GDB并加载可执行文件 gdb 可执行文件 # 启动GDB并加载可执行文件和核心转储文件 gdb 可执行文件 核心转储文件 # 调试正在运行的进程 gdb -p 进程ID2.2 退出GDB# 退出GDB quit # 或 q3. 断点管理3.1 设置断点# 在指定行设置断点 break 文件名:行号 # 或 b 文件名:行号 # 在指定函数处设置断点 break 函数名 # 或 b 函数名 # 在指定地址设置断点 break *地址 # 设置条件断点 break 位置 if 条件3.2 查看断点# 查看所有断点 info breakpoints # 或 info break3.3 删除断点# 删除指定编号的断点 delete 断点编号 # 或 del 断点编号 # 删除所有断点 delete3.4 禁用/启用断点# 禁用指定断点 disable 断点编号 # 启用指定断点 enable 断点编号 # 启用断点并只执行一次 enable once 断点编号4. 程序控制4.1 运行程序# 运行程序 run # 或 r # 运行程序并传递参数 run 参数 # 或 r 参数4.2 单步执行# 单步执行不进入函数 next # 或 n # 单步执行进入函数 step # 或 s # 单步执行直到当前函数返回 finish # 继续执行直到遇到下一个断点 continue # 或 c4.3 控制执行速度# 执行指定数量的语句 step 数量 # 或 next 数量 # 执行直到指定位置 until 位置5. 查看和修改数据5.1 查看变量# 查看变量值 print 变量名 # 或 p 变量名 # 以指定格式查看变量 print /格式 变量名 # 格式说明 # x - 十六进制 # d - 十进制 # u - 无符号十进制 # o - 八进制 # t - 二进制 # a - 地址 # c - 字符 # f - 浮点数 # 查看数组或结构体 print 数组名 print 结构体名 # 查看表达式结果 print 表达式5.2 查看内存# 查看指定地址的内存 x/nfu 地址 # 说明 # n - 显示的单元数 # f - 显示格式同print命令 # u - 每个单元的大小 # b - 字节 # h - 半字2字节 # w - 字4字节 # g - 双字8字节 # 示例查看从地址0x12345678开始的10个字节以十六进制格式显示 x/10xb 0x123456785.3 修改变量值# 修改变量值 set variable 变量名 新值 # 或 set 变量名 新值 # 示例将变量i的值设置为10 set variable i 105.4 查看寄存器# 查看所有寄存器 info registers # 查看指定寄存器 info registers 寄存器名 # 示例查看 eax 寄存器 info registers eax6. 堆栈管理6.1 查看堆栈# 查看堆栈回溯 backtrace # 或 bt # 查看指定数量的堆栈帧 backtrace 数量 # 或 bt 数量6.2 切换堆栈帧# 切换到指定堆栈帧 frame 帧编号 # 或 f 帧编号 # 切换到上一个堆栈帧 up # 切换到下一个堆栈帧 down6.3 查看当前堆栈帧信息# 查看当前堆栈帧信息 info frame # 查看当前堆栈帧的局部变量 info locals # 查看当前堆栈帧的参数 info args7. 高级功能7.1 观察点# 设置观察点当变量值改变时中断 watch 表达式 # 设置读观察点当变量被读取时中断 rwatch 表达式 # 设置访问观察点当变量被读写时中断 awatch 表达式 # 查看观察点 info watchpoints7.2 信号处理# 查看信号处理 info signals # 设置信号处理 handle 信号 操作 # 操作可以是 # stop - 收到信号时停止 # print - 收到信号时打印信息 # pass - 将信号传递给程序 # noprint - 不打印信息7.3 命令脚本# 定义命令脚本 define 命令名 命令序列 end # 示例定义一个显示所有局部变量的命令 define show_locals info locals end7.4 远程调试# 作为服务器启动GDB gdbserver 主机:端口 可执行文件 # 连接到远程GDB服务器 target remote 主机:端口8. 实际使用示例8.1 基本调试流程编译程序时添加调试信息gcc -g -o program program.c启动GDB并加载程序gdb program设置断点break main break 42 break function_name运行程序run单步执行next step查看变量print variable print array[0] print *pointer查看内存x/10xw 0x12345678继续执行continue8.2 调试崩溃程序启用核心转储ulimit -c unlimited运行程序直到崩溃使用GDB分析核心转储gdb program core查看崩溃位置backtrace9. 常用命令速查表命令简写功能breakb设置断点deletedel删除断点runr运行程序nextn单步执行不进入函数steps单步执行进入函数continuec继续执行printp查看变量值xx查看内存backtracebt查看堆栈回溯framef切换堆栈帧info breakpointsinfo break查看断点信息info locals-查看局部变量info args-查看函数参数watch-设置观察点quitq退出GDB10. 高级调试技巧10.1 条件断点的高级用法# 当循环变量i等于100时中断 break loop.c:42 if i 100 # 当指针不为空时中断 break function.c:123 if pointer ! NULL10.2 内存检查# 检查内存是否可访问 print *((char *)0x12345678) # 查看内存区域 x/20xw 0x1000000010.3 线程调试# 查看所有线程 info threads # 切换到指定线程 thread 线程ID # 设置线程特定断点 break 位置 thread 线程ID10.4 加载共享库符号# 查看已加载的共享库 info sharedlibrary # 加载共享库符号 sharedlibrary11. 总结GDB是一个功能强大的调试工具掌握其基本命令和高级功能可以大大提高开发和调试效率。通过本文档的学习您应该能够熟练使用GDB的基本命令进行程序调试设置和管理断点、观察点查看和修改程序运行时的状态分析程序崩溃原因使用高级功能进行复杂调试实践是掌握GDB的最佳方法建议在实际项目中多使用GDB进行调试逐渐熟悉各种命令和技巧。