文章目录
🌈 Ⅰ gdb 介绍
1. gdb 概念
- 在 Linux 下功能都由独立的软件执行,vim 负责编辑代码,gcc / g++ 负责编译代码,而 gdb 负责调试代码。
2. gdb 功能
- 动态改变程序的执行环境。
- 自定义启动运行需要调试的程序。
- 在指定位置使用条件表达式设置断点。
- 在程序暂停时观察代码内变量值的变化。
🌈 Ⅱ gdb 基本操作
- 当前有一个从 1 加到 100 的代码,之后所有的调试操作都是基于该代码实现。
01. 生成调试信息
-
格式:g++ -g 源文件 -o 目标文件
-
gcc / g++ 在编译时默认采用 release 模式,该模式不带调试信息,无法调试。
-
在编译文件时需要加上
-g
选项生成对应的调试信息,才能使用 gdb 调试。- 如:g++ -g test.cpp -o test.debug,目标文件 test.debug 就是带调试信息的可执行程序。
02. 启动 gdb
- 格式:gdb + 调试文件:这里的是在命令行输入 gdb test.debug。
- 输入之后如果出现了蓝框框里的内容,则说明调试信息读取成功。
03. 退出 gdb
- 直接输入 ctrl + d 或 q + 回车 或 quit + 回车 即可。
04. 查看源码
- list:列出程序源代码,默认每次显示 10 行 (list 可简写成 l)。
- list 行号:显示当前文件以 [ 行号 ] 为中心的前后 10 行源码。
- list 函数名:显示以 [ 函数名 ] 所在所在行为中线的前后十行源码。
- 重复输入 list:接着最后一次执行的 list 命令 (上面三个都是),输出下边的内容。
05. 运行程序
- 在进行调试之前首先要让程序运行起来。
- 直接输入 r 或 run 即可,程序会一直运行到断点处,如果没有断点则直接跑完整个程序。
- 没有断点的程序是无法调试的
06. 断点设置
1. 增加断点
- break 行号:break point,给指定行号打上断点 (break 可简写成 b)
- break 函数名:在对应函数的入口处 (函数体的第一行有效代码) 打上断点。
- 如果断点打在了空行,gdb 是不会对该断点起反应的。
2. 显示断点
- info b:按照打断点的先后顺序显示当前程序的断点设置情况。
- 断点是有编号的,test.cpp 文件的断点在第 20 和 13 行,20 是一号断点,13 是二号。
- 断点编号 Num 依次递增不会减小,即使把第 20 行的一号断点删了,13 行的断点编号也不会变成 1,之后新增的断点序号也是从 3 开始。
- 断点信息解释:
断点信息 | 说明 |
---|---|
Num | 断点序号,断点序号只增不减 |
Type | 断点类型,断点类型位 breakpoint |
Disp | 断点执行一次之后是否有效,有效为 keep 反之为 dis |
Enb | 断点使能,表示该断点是否被打开 |
Address | 断点处在哪个地址上 |
What | 断点的具体位置 |
3. 删除断点
- delete 断点编号 n:指定删除第 n 个断点 (delete 可简写成 d)
- clear 行号:清除指定行的断点。
- delete breakpoints:清除所有断点。
4. 停用断点
- disable 断点编号 n:保留第 n 个断点,但不让它起作用。
5. 启用断点
- enable 断点编号 n:开启被停用的第 n 个断点。
07. 逐过程运行
1. 逐过程概念
- 遇到函数调用时会一次性执行完该函数,不会进入函数体调试,且会跳过空行。
2. 逐过程指令
- next (n):在程序运行过程中,只要按下 n 就会自动跳到下一个非空行处。
- 为了方便演示,将断点改成了 20 行。
3. 逐过程示例
08. 逐语句运行
1. 逐语句概念
- 遇到函数调用时,会进入函数体查看细节进行调试,且会跳过空行。
2. 逐语句指令
- step (s):程序运行过程中,只要遇到函数调用就会进到函数体瞅瞅。
3. 逐语句示例
- 在第 20 行碰到了函数调用,step 直接跳到该函数的第一行有效代码处。
09. 快速运行当前函数
- finish:需要快速定位 BUG 在哪个函数,并不想查看细节时可用该指令。
- 将目前所在的函数立马跑完,如果程序此时挂掉了再在该函数细找 BUG。
10. 查看变量的内容
1. 指定显示变量
- display 变量:在代码的循环中,变量的值可能会一直变化,该指令可将变量的值一直显示。
- 每指定显示一个变量时,该变量都会带上一个变量编号,如下图的 sum 就是 1 号变量 i 时 2 号。
2. 取消显示变量
- undisplay 变量编号:觉得某个变量没问题时可以取消显示该变量。
- sum 的变量编号为 1,取消显示 sum 变量的话就要执行 undisplay 1
11. 运行至下一个断点
- 在 gdb 中,当程序运行到断点时停止后,可用 continue © 命令,继续执行程序,直到下一个断点或程序结束 (前提是中间没出现 BUG)
- 当前断点被打在 20 和 24 行。
- 执行 run 命令运行程序后,程序停在了第一个断点处 (第 20 行),如果到下一个断点之前没有出现 BUG,则直接跳到下一个断点。
12. 跳转至指定行
概念
- until 行号:直接跳转到指定行。
- 如果确定了某个函数或者循环没有问题,可以用该命令跳到指定行查看运行结果是否正确。
示例
- until 15 直接跳过函数中的 for 循环到第 15 行查看 sum 的值是否和预期的一致。