目录
前言
一、gdb打开可执行程序
二、查看代码与操作断点
1.l 查看代码
2.b 打断点
3.info b 查看断点信息
4.d 删除断点
5.disable 和 enable 断点的禁用与启用
三、调试
1.r 启动调试
2. n 逐过程
3. s 逐语句
4.display显示变量
5.undisplay 取消显示
四、跳转命令与特殊命令
1.until 跳转到指定行
2. c 跳转到断点处
3.finish 运行到当前函数结尾
4.bt 查看调用堆栈
5. set var 修改变量值
前言
在vs2022,有可视化界面,我们调试起来非常简单,点一点就行了,在linux下,如果我们需要调试代码,就得用到工具gdb。
没有安装gdb的可以使用下面代码安装
sudo yum install -y gdb
一、gdb打开可执行程序
调试之前,我们需要先写出一份代码,我们拿下面的累加的代码举例调试
#include <stdio.h>int AddToEnd(int end)
{int i = 1;int sum = 0;for(;i<end;i++){sum+=i;}return sum;
}int main()
{int end = 100;int result = 0;result = AddToEnd(end);printf("result:%d\n",result);return 0;
}
程序很简单,我们vim编辑好代码 gcc 编译一下,再使用gdb + 可执行程序进行调试。
发现没有debug模块,这是因为我们gcc编译默认模式为release模式,如果要使用debug模式需要添加 -g
二、查看代码与操作断点
l(list) | 查看代码 |
b(breakpoint) | 打断点 |
info b | 查看断点 |
d (delete) + 断点编号 | 删除断点 |
disable | 禁用断点 |
enable | 启动断点 |
1.l 查看代码
输入 l 可以查看部分代码,gbd会将他认为重要的部分代码给我们做展示。
输入 l + 1 从第一行开始查看代码,一直按回车可以往下查看
2.b 打断点
打断点的三种方式
b + 行号
b + 函数名
b + 指定文件:行号(多文件下比较方便)
3.info b 查看断点信息
info b 查看断点信息
4.d 删除断点
d + 断点编号删除断点
5.disable 和 enable 断点的禁用与启用
info b查看断点信息中,Enb这一行为y代表断点是启动状态。
disable + 编号 可以让断点被禁用。
输入 r 运行并不会在被禁用的断点中停止
enable + 编号 启动断点,这样 r 运行就会在断点处停止下来。
三、调试
r(run) | 启动调试 |
n(next) | 逐过程调试 |
s(step) | 逐语句调试 |
display | 显示变量 |
undisplay + 编号 | 取消变量显示 |
1.r 启动调试
r(run)启动调试,遇到断点处停下来,如果一直没遇到断点,就相当于运行程序。
2. n 逐过程
n (next)为逐过程调试代码,相当于vs2022的F10,遇到函数直接执行到下一行,不进入函数内部。
3. s 逐语句
s(step)为逐语句调试代码,相当于vs2022的F11,遇到函数会进入函数继续调试,如下。
4.display显示变量
display + 变量 可以显示该变量的值,后续执行时都可以看到该变量。
5.undisplay 取消显示
undisplay + 变量编号 取消显示变量。
四、跳转命令与特殊命令
until | 跳转到指定行 |
c | 跳转到断点处 |
finish | 运行到当前函数结尾 |
bt | 查看调用堆栈 |
set var | 修改变量值 |
1.until 跳转到指定行
until + 行号 跳转到指定行。
2. c 跳转到断点处
c(continue) 跳转到下一个断点处
3.finish 运行到当前函数结尾
finish 将当前函数运行完停止。
4.bt 查看调用堆栈
bt 查看调用堆栈,这里在函数AddToEnd内部,因此有两个堆栈。
5. set var 修改变量值
set var 变量 = 值 修改变量的值。如下,修改了变量的值,输出结果也不一样了。