目录
- 1.进入与退出
- 2.Linux下的debug和release:
- 3.开始测试
- 1.先写一个可调试的程序
- 2.开始调试
- 3.调试指令详解(按照一个程序正常调试步骤进行解释)
- 1. r/run = ctrl+F5(开始执行不调试)
- 2. list/l 显示代码
- 3.打断点 b
- 4.查看打的断点 info b
- 5.继续跑 r
- 6.逐语句(s/step)或者逐过程(n)
- 7.监视 display+变量
- 8.只想看一次这个变量的值 P或者p
- 9.删除长显示 undisplay+序号 序号 序号
- 10.结束当前函数 finish
- 11.再打断点b + 行号
- 12.跳到下一个断点处 continue/c
- 13.跳出循环until
- 14.删除断点 d + 断点编号
- 15.不删掉断点,但是保存断点 disable+断点编号
- 16.打开disable的断点 enable+断点编号
- 17.查看各级函数调用及参数 bt/breaktrace
- 18. 改变调试时中的某些变量的值 set var 变量=修改值
1.进入与退出
进入:gdb + 可执行程序
退出:quit
2.Linux下的debug和release:
1.如果一个程序是可以被调试的,该程序的二进制文件一定加入了一些debug信息
2.vs中发布程序的时候,通常有两种发布方案:debug和release
3.release没有包含调试信息
4.centos中,默认形成的可执行程序是release
5.如果想要调试: gcc test.c -o test -g
从上图中可以看出debug下的test比release占用的空间大一点
此时无论运行上面的debug还是release都没问题
3.开始测试
1.先写一个可调试的程序
即方便复制调试:
#include<stdio.h>
int SumToTop(int top)
{
int sum = 0;
for(int i = 1;i<= top;++i)
{
sum+=i;
}
return sum;
}
int main()
{
int top = 100;
int res = SumToTop(top);
printf("res = %d\n",res);
return 0;
}
然后退出编译
此时我们运行这个test
如果我们需要这个程序能够调试则需要
-g
2.开始调试
注意:有时候调试的时候会出现一些报错,这些报错不会影响调试,所以不需要去管
3.调试指令详解(按照一个程序正常调试步骤进行解释)
我们在自己的常用编译器上输入我们的test.c(我这里用的是vs2019,两者对比能够更好理解)
1. r/run = ctrl+F5(开始执行不调试)
在vs中,最开始按
F10
会进入调试,并进入int main的下一行
继续F10就会逐过程逐语句的进行
在VS中,大多数情况下我们会给代码打断点,然后
F5
就会从断点处开始进行调试
总之我们都需要将代码跑起来,然后调试
2. list/l 显示代码
延伸补充:
这个l一次显示十行代码
l后面加数字会得到这个数字的前五个和后四个的位置所有代码即:
3.打断点 b
可以根据函数名打,也可以根据行号打(常用)
b+行号
翻译:
一号断点打在 0X40056a
文件test.c
行号是16
4.查看打的断点 info b
显示我们打的断点
断点编号,类型, ,enb是否开启,地址,在哪打的断点
5.继续跑 r
6.逐语句(s/step)或者逐过程(n)
逐过程:
比如代码中我们写的循环,变量,我调用的函数等等
不会进入这个
而是以分号为结束语句
即:不会进入函数,而是把函数当作一个语句进行调试
逐语句正好相反,所以不做解释
需要注意:
我们进入for循环时,s和n的效果都一样都是逐语句进行(也符合我们的日常操作)
7.监视 display+变量
display + 变量 (查看具体变量的值)
display + &变量(查看变量的地址)
此时我们再s或者n每次显示的时候就会显示这些监视的值
8.只想看一次这个变量的值 P或者p
9.删除长显示 undisplay+序号 序号 序号
可以一次删除一个监视,或者多个监视
可以看到我们的监视有序号1 2
所以(删除&sum)
10.结束当前函数 finish
当我们进入一个函数中的循环时,我们已经发现这个循环是对的,可以用finish进行跳出循环,并直接返回结果,即:
11.再打断点b + 行号
先用l查看代码,然后b打断点
因为1号断点我们已经运行了一次,所以会出现
breakpoint already hit 1 time
12.跳到下一个断点处 continue/c
下图解释:
先重新跑一次,跑到1号断点处
进入循环
我们发现这个循环没问题,就可以continue进入下一个断点
13.跳出循环until
方法一:
在10 行处打一个断点,然后continue
方法二:
until
14.删除断点 d + 断点编号
15.不删掉断点,但是保存断点 disable+断点编号
16.打开disable的断点 enable+断点编号
17.查看各级函数调用及参数 bt/breaktrace
下图解析:
查看函数调用堆栈的信息
vs vs2019