Linux(CentOS 7)--gdb的基本调试指令
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
一下面的代码为例介绍一下linux中gdb调试的基本指令
创建一个文件myfile.c文件代码内容如下
1 #include <stdio.h>
2
3 int Add(int x, int y)
4 {
5
6 return x+y;
7 }
8
9 int main()
10 {
11 int a = 10;
12 int b = 20;
13
14 int ret = Add(a, b);
15 printf("%d\n", ret);
16
17 return 0;
18 }
gcc myfile.c编译过后的文件是不支持调试的release版本
所以
我们要带上-g选项 gcc -g myfile.c 让gcc以debug的方式编译程序
此时成功了
l (行号/函数名显示源代码
默认每次列10行
r (run) 运行程序(开始调试)
因为我们还没有为这段代码设置断点所以在我们开始调试的时候程序就直接结束并输出结果了。
b(break) 行号/函数在某一行/函数处设置断点
下面我们在11行设置一个断点
- Breakpoint 1表示这个断点的序号为1号后面的是地址不用管
- file mytest.c表示在哪个文件当中
- line 11表示的是代码中的行号
此时我们再 r 一下程序就会停在11行处
c(continue) 跳到下一个断点处
我们在14行处再设置一个断点然后利用c直接的跳到第二个断点处
n(next) 逐过程 不进入函数体内部
注意调试结束的时候断点是不会自动删除的我们再次按下r还是会跳到第一个断点处
d(delete breakpoints) 断点的序号 删除断点
d不加断点序号时是删除所有的断点加上序号只删除改序号的断点
info b :查看断点信息
其中Enb这一列表示的是该断点是否是被启用y表示启用n表示禁用在某些场景下我们希望某个断点失去它的作用(忽略该断点的存在)但希望留下它的位置就可以使该断点禁用但不删除它。
现在我们来删除第二个断点
s(step) :逐语句进入函数体内部
p :显示变量
但是这个显示并不会一直保留在屏幕上如下
当我们再执行n的时候a b ret的值就会不再显示如果想要一直显示就需要用到下面一个命令
diplay :常显示
左边的序号作用和断点的序号一样在我们需要取消常显示的时候就要根据序号来取消而不是名称
undisplay :取消常显示
接下来介绍几个比较特殊的命令
finish 执行到当前函数返回 然后停下来
我们进入Add函数之后输入finish就会执行完这个函数不论函数有多长都会执行完然后停在返回处。
最后一行的Value returned is $7 = 30表示的是返回的有效值是30。
我们看到此时的ret还没有被赋值是随机值
完成赋值
disable breakpoints :禁用断点
enable breakpoints :启用断点
我们再在15行设置一个断点但是禁用该断点
此时我们进行c调试就会直接结束而不会停在15行
我们开启15断点的启用
就会停在15行的断点处
info locals :查看当前栈帧的局部变量的值
有了这个我们就可以直接查看当前所有的局部变量的值
但是不会常显示。
bt(breatracek) :查看各级函数调用和参数各个函数调用之前的关系
我们进入Add函数之后输入bt
until 行号:直接跳到某一行
最后就是q(quit) 退出调试
当我们的调试还没结束的时候它会提示我们是否确认要退出输入y是n不。
当我们一次调试结束的时候再退出调试就不会询问我们了
本文章介绍的仅仅是一些基本的gdb使用命令并没有包含全部