【Linux 07】gdb 调试器基本操作

🌈 Ⅰ gdb 介绍

1. gdb 概念

  • 在 Linux 下功能都由独立的软件执行,vim 负责编辑代码,gcc / g++ 负责编译代码,而 gdb 负责调试代码

2. gdb 功能

  1. 动态改变程序的执行环境。
  2. 自定义启动运行需要调试的程序。
  3. 在指定位置使用条件表达式设置断点。
  4. 在程序暂停时观察代码内变量值的变化。

🌈 Ⅱ 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 + dq + 回车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 的值是否和预期的一致。

在这里插入图片描述

  • 81
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值