1.debug和release模式
我们开发内容时的模式一般为debug模式,方便我们进行调试,而release一般是不支持调试的。
而Linux下的gcc/g++默认都是release环境,是没办法直接用gdb调试的,那么有什么解决办法嘛?
有的,兄弟有的:
在我们之前自己编写的makefile文件中:加入-g
这样make出来的可执行程序就满足进行调试的要求哩
2.认识gdb
先创建一个mycode.c
用vim写入:区间求和小程序
#include <stdio.h>
int Sum(int s, int e)
{int result = 0;for(int i = s; i <= e; i++){result += i;}return result;
}
int main()
{int start = 1;int end = 100;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d-%d]=%d\n", start, end, n);return 0;
}
这里会显示有错误,因为C89里int是不能放在for循环里的,需要改成:
gcc mycode.c -o mycode.c -std=c99 -g
- 记得一定要加-g,不然就没法调试哦!!!!
- 输入quit即可退出gdb
3.gdb命令详解
有兄弟发现gdb好难用呀,有木有更加简单好用的呢?
有的,兄弟有的:
安装cgdb:
sudo yum install -y cgdb
1.行号,断点和断点查看
先使用cgdb+可执行程序名进入cgdb
- 上面是代码区
- 下面是debug区
指令罗列:
-
- b+行号 给某一行打断点
可见代码区第五行被标红,说明第五行被打了断点
- 2.info b 查看断点与断点编号
显示断点编号为1,位置为mycode.c的第五行
- 3.d + 断点编号(不是行号!!!!!!) 删除断点
info b 显示没有断点了
-
- run 运行程序(有断点就停下来)
-
- l + 文件名:行号
2.逐语句和逐过程
- 当前我设置了一个断点,可以看到断点行有一个函数。
走函数还是不走函数呢?
- n ---------- 不进入函数
直接走到第17行,跳过函数
- s-------------- 进入函数
可以看到,输入s就进入到了函数内部
3.finish,p,disable,enable
初始位置在第16行(打断点的位置)按下s后进入函数,再按下finish就直接走完函数进程,回到第16行。
- finish -----------走完函数进程
- p + 变量名(也可以是表达式!!!!) -------------------打印变量名的值
- disable + 断点编号---------使断点无效但不删除断点,(可见断点处变黄)
- enable + 断点编号 --------------使断点复原
4.c,until ,display,undisplay
- c -------------从一个断点跳到另一个断点
- until + 行号n----------从
当前行
直接执行到第n行
- display + 变量名---------------------在
每次gdb操作后都在屏幕上显示变量名的值
- undisplay + 变量名编号----------------取消display的功能
4.三个调试小技巧
1.watch+变量————————变量发生变化时会提醒
- 这里我用watch标记了“result”
- 发现一旦result发生改变时就会发出提醒————并提供原值和新值
(删除方式和删断点一致)
2.set var+变量= … ————————仅在调试过程中改变变量的值,但退出gdb后值不改变
- 这里用 p 查出原来result值为5050,使用 set var result =1,改变了result的值,得出运行结果为1
3.b + 行号 + if (条件)————————在某行设置条件断点
- 在第 7 行设下条件断点
- 可知i==10时,result为45