Linux下GDB调试工具完全指南:25个核心命令详解与实战示例
github地址
有梦想的电信狗
前言
GDB(GNU Debugger)
是Linux
开发中不可或缺的调试工具,尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验,详解25个高频GDB命令,配合场景化案例和注意事项,助你快速掌握Linux调试核心技能。
我们以该代码为例来进行gdb的演示,为了方便起见,代码中标识了行号。
#include <stdio.h>2 3 int addToTop(int top){4 int res = 0;5 int i = 1;6 for(; i <= top; ++i){7 res += i;8 }9 return res;10 }11 12 int main(){13 printf("debug begin\n");14 15 int top = 100;16 int sum = addToTop(top);17 18 printf("sum is : %d\n", sum);19 20 printf("debug end\n");21 return 0;22 }
准备工作
- 程序的发布方式有两种,
debug
模式和release
模式 - Linux
gcc/g++
出来的二进制程序,默认是release
模式 - 要使用
gdb
调试,必须在源代码生成二进制程序的时候, 加上-g
选项
- 我们可以修改
makefile
中的依赖方法来进行-g
编译
加上-g选项后,携带有调试信息,就可以用gdb进行调试了
gdb mycode # 开始调试该程序
1. 基础调试命令
80%的指令都是围绕定位问题产生的,打断点就是找问题的一种方式
1.1 list/l 行号
描述:从指定行号开始显示源代码(默认显示10行),接着上次的位置开始列出。
注意:需在编译时添加-g
选项保留调试信息。
场景:快速定位代码上下文。
(gdb) l 0 # 从该文件的开始显示代码
在gdb中,默认会记录最近一次指令,因此连续回车会一直执行上一条指令。
1.2 list/l 函数名
描述:列出指定函数的完整源码。
注意:函数需在当前加载的符号表中。
场景:查看函数实现细节。
(gdb) l addToTop # 显示addToTop函数代码
(gdb) l main # 显示main函数代码
2. 断点管理
2.0 run/r
描述:从头开始执行程序,直到断点或程序结束。
注意:重复执行会重新加载程序。
场景:启动调试或重新运行程序。
(gdb) r # 启动程序
2.1 break/b 行号
描述:在指定行设置断点。
注意:行号需在有效代码范围内。
场景:精准拦截问题发生点。
(gdb) b 15 # 在第15行设断点
(gdb) b 16 # 在第16行设断点
(gdb) b 21 # 在第21行设断点
2.2 break/b 函数名
描述:在函数入口设置断点。
注意:需确保函数已加载。
场景:监控特定函数调用。
(gdb) b addToTop # 在addToTop入口暂停
### 2.3 info break/b
描述:显示所有断点信息(编号/位置/启用状态)。
场景:查看当前断点布局。
(gdb) info b # 显示断点列表
查看我们已设置的断点信息:
2.4 delete/d breakpoints/b n
我们在删除断点时,不能删除指定代码行的断点。
在我们使用info b
指令时,该指令为我们的断点进行了编号,需要通过编号来删除断点。
描述:删除指定编号的断点。
注意:删除后不可恢复。
场景:清理无效断点。
(gdb) delete 1 # 删除1号断点
3.5 disable/enable breakpoints
有时会不想删除这个断点(因为要保留调试痕迹),但想让这个断点不工作(因为已经确认错误并不在当前断点内),因此要对断点进行使能
描述:临时禁用/启用断点。
场景:保留断点配置但不触发。
(gdb) disable 1-3 # 禁用1-3号断点
(gdb) enable 2 # 启用2号断点
- enable断点指令如下
3. 单步调试与流程控制
2.1 next/n
描述:单步执行(不进入函数)相当于VS下的逐过程。
注意:跳过库函数和用户函数调用。
场景:快速跳过无需深入调试的代码块。
(gdb) n # 执行下一行
2.2 step/s
描述:单步执行(进入函数内部)。 相当于VS下的逐语句。
注意:可能跳入系统库函数(如printf)。
场景:深入分析函数内部逻辑。
(gdb) s # 进入函数
如果代码已经是基本的C语句了,n和s没有区别,n不会跳过整个for循环
2.3 finish
描述:执行完当前函数并返回调用点。
注意:不能在main函数中使用。
场景:快速跳出复杂函数。
(gdb) finish # 执行到函数返回
- 进入了一个函数后,直接将该函数运行结束,直接查看该函数的运行结果,方便排除问题是否在该函数内
2.4 until X行号
until 直接运行到 x 行,跳过一定行数的代码,便于直接定位问题
描述:跳转到指定行继续执行。
注意:目标行需在当前函数内。
场景:跳过循环中的已知安全代码。
(gdb) until 30 # 跳转到30行
2.5 continue/c
描述:跳转到指定行继续执行。
注意:目标行需在当前函数内。
场景:跳过循环中的已知安全代码。
(gdb) continue
相当于VS中的F5 从当前位置,直接运行到下一个断点处,如果中间出现了报错,那么错误就在当前范围内
4. 变量操作与堆栈分析
4.1 print/p 变量
描述:打印变量当前值。
注意:支持表达式计算。
场景:实时查看数据变化。
(gdb) p count # 显示count值
(gdb) p arr[3] # 查看数组元素
4.2 set var
描述:修改运行中的变量值。
注意:类型需匹配。
场景:模拟异常数据测试。
(gdb) set var count=0 # 强制重置计数器
例如在循环中,i递增100次,预判到可能在第95次递增时出现问题,可以通过set var修改循环变量的值,直接跳到第95次递增的过程
4.3 display 变量
描述:持续跟踪变量(每次暂停自动显示)。
场景:监控关键变量变化趋势。
(gdb) display total # 持续显示total变量
display
后左侧会有变量编号,undisplay
取消变量跟踪时,后面需要跟左侧显示的变量编号
4.4 info locals
查看当前函数栈内的局部变量
描述:显示当前栈帧的所有局部变量。
场景:快速查看函数内部状态。
(gdb) info locals # 列出当前函数局部变量
5. 高级调试技巧
5.1 backtrace/bt
查看各级函数的互相调用关系和传参情况
描述:显示函数调用栈(含参数)。
场景:分析崩溃时的调用链路。
(gdb) bt # 显示调用堆栈
5.2 frame N
描述:切换到指定堆栈帧(配合bt使用)。
场景:查看上级调用者上下文。
(gdb) frame 2 # 查看第二层栈帧
5.3 watch 变量
描述:设置数据观察点(变量修改时暂停)。
注意:仅对特定内存地址生效。
场景:定位意外修改问题。
(gdb) watch *0x7fffffffe234 # 监控内存地址
结语
不要认为gdb或VS等调试工具很先进,思考代码逻辑或者printf信息也是调试方法,只要能快速方便的定位并解决问题,都是好方法
掌握GDB调试技能是Linux开发者的核心能力之一。本文涵盖的25个命令已覆盖90%日常调试场景,建议结合真实项目实践加深理解。欢迎在评论区交流实战经验!
以上就是本文的所有内容了,如果觉得文章写的不错,还请留下免费的赞和收藏,也欢迎各位大佬在评论区交流
分享到此结束啦
一键三连,好运连连!