目录
1、前言
我们知道程序的发布方式有两种,一种是debug版本、另一种是release版本,debug版本是可以进行调试的,而release版本是经过编译器的优化的,整体的效率是要比debug版本高很多的,但是release版本下是不能够进行调试的。
2、编译链接
在Linux下我们可以使用gcc/g++这样的编译器对程序进行编译,如如下一简单程序:
1 #include<stdio.h>
2
3 int Sum(int top)
4 {
5 int sum = 0;
6 int i = 0;
7 for (i = 1; i <= top; i++)
8 {
9 sum += i;
10 }
11 return sum;
12 }
13
14 int main()
15 {
16 int n = 100;
17 int ret = Sum(n);
18 printf("%d\n", ret);
19
20 printf("hello world1!\n");
21
22 printf("hello world2!\n");
23
24 printf("hello world3!\n");
25
26 printf("hello world4!\n");
27
28 printf("hello world5!\n");
29 return 0;
30 }
我们对其进行编译链接时只需要输入命令:
gcc -o mytest test.c
//-o选项指的是程序执行到编译链接结束后生成可执行程序(Linux下是.out后缀,Windows下是.exe后缀)
//但需要注意的是Linux并不以文件后缀名来区分文件
//-o后跟的是自定义的可执行文件名称(若不指定生成名称Linux下默认生成a.out)
或者:
gcc test.c -o mytest
//只要-o后接生成文件自定义的名称,对某个文件名的编译链接的位置可以调整
使用gdb对某个程序进行调试只需要输入命令:gdb 程序生成的可执行程序名称
如此处mytest就是一个可执行文件,只需输入如下命令即可调试:
gdb mytest
但是gcc/g++默认编译链接出来的是release版本的,是不能够进行调试的,可能会遇到如下警告:
这时需要在进行编译链接时增加一个 -g 选项就可以生成debug版本的程序了:
gcc -o mytest test.c -g
这时再执行:
gdb mytest
就可以进行调试了,在命令行中输入l(list的简写)就可以查到调试的代码了,输入 l 0表示从第一行开始后的十行代码 ,继续输入l就可以继续查看下一个十行的代码,如下图所示:
3、调试
1. 设置断点:b 行号,b是break的简写
2. 查看断点:info b,info是information的简写
如如下在17和25行设置了两个断点 ,其中断点信息中的Num表示断点的编号
3. 开始调试:r 直接开始调试,如果没有设置断点就直接运行结束,如果设置了断点则会运行到第一个断点处,多次进行r操作则会重复如上操作,如下则会运行至第一个断点处,即17行
4. 删除断点:d 断点编号,d是delete的简写,注意删除断点并不是 d 断电所在行号,而是 d 断点的编号,如删除17行的断点,17行断点的编号是1,删除该断点就是 d 1
5. 逐过程: n 是逐过程调试程序,类似于VS2019上的F10,如果遇到函数是不会进入到函数内部调试的,n 是next的简写
可以看到26行和28行之间空行被跳过了,可以知道在调试程序时空行是会被跳过的。
6. 逐语句:s 是逐语句调试程序,类似于VS2019上的F11,如果遇到函数是会进入到函数内部调试的,s 是step的简写
可以看到s逐语句调试已进入到函数内部调试。
7. 打印变量内容:p 变量名,p是print的简写,如在循环中打印sum的值以便观察
8. 执行完当前函数:finish,如执行完finish后,当前的Sum函数就能够一下子跑完了
9. 设置常显示:display 变量名,跟踪查看一个变量,每次停下来都显示它的值(取消常显示:undisplay 变量名)
10. 运行至下一断点处:c,c是continue的简写
11. 退出gdb:q 退出gdb调试,q是quit的简写
4、结语
谢谢阅读~