Linux下代码调试器---gdb的使用
零.前言
在Windows系统中,程序的运行调试等等全都被一个编译器完全封装了起来,但是在Linux系统中,程序的运行和调试是有不同的软件进行操作处理的,在上一节中分享了Linux下代码编译器gcc/g++,本文将详细介绍Linux系统下的调试器gdb的使用。
1.debug和release
我们在使用VS编译器的时候,通常在上方会有这样的选项:
只有debug版本才可以进行调试!
当一个程序是debug版本的时候,在其二进制.o文件中一定加入了debug的信息。而release版本中没有加入debug信息。
Linux下默认生成的是release版本,二进制文件并没有加入debug信息。
2.进入debug模式
我们首先先创建文件test.c并向其中写入如下内容:
#include<stdio.h>
int sum(int a)
{
int i;
int sum=0;
for(i=1;i<=a;i++)
{
sum+=i;
}
return sum;
}
int main()
{
int a=100;
int result=sum(a);
printf("result=%d",result);
return 0;
}
只需要加入-g指令就可以将可执行文件转换成debug版本。
gcc test.c -o test -g
如果你的代码使用了C99原则,可以在后面加上-std=c99不然会有报错:
gcc test.c -o test -std=c99 -g
我们将原来的可执行文件a.out与test进行对比,发现test的空间更大一些,这是因为它其中加入了debug调试信息。
3.调试程序
(1)进入调试模式
gdb test
(2)运行程序指令:r
进入调试之后,我们需要先让程序跑起来才能继续进行调试:
r(run) //注:括号中的内容为方便理解,只需要打r就可以了,如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。
注意我们要先打断点再跑程序,不打断点的话程序直接跑完了。
(3)显示代码:l
我们可以通过l指令去显示代码内容,查看当前行的上下文,默认显示十行。
l(list) x //显示包含第x行附近的十行代码
l 函数名 //显示该函数附近的十行代码(相当于把函数执行的第一行看成x)
当我们再继续执行l指令时,会继续向下显示十行:
这里没有显示十行,是因为程序已经完全显示结束。
(4)打断点/显示断点指令:b/info b
在VS中F9是专门打断点的键,而在gdb中我们使用b来打断点。
b(breakpoint) x //在第x行打断点
info b //显示所打的断点
(5)逐过程与逐语句:s/n
s(step) //逐语句(可以进入函数)
n(next) //逐过程
逐过程就相当于VS中的F11,逐语句就相当于F10。
(6)查看/关闭查看变量变化:display/p/undisplay
display x //显示变量x的变化,在之后的每一次s/n,x的值都会被打印出来。
p x //只显示变量x的变化一次。
undisplay n //不再显示编号为n的变量的值。
显示sum:
关闭显示sum:
只显示一次sum:
注意:display和p后面是变量名,display后面是变量编号,接变量名会报错。
(7)结束函数与跳转:finish/continue/until
finish //结束当前函数(比如循环次数比较多的函数)
continue //直接执行到达下一个断点
until x //跳转执行到第x行
finish直接执行完for函数,可以看到sum变成了5050
我们在第18行再打一个断点,通过continue直接到达第18行:
until同理,这里不再演示了。
(8)在debug中修改变量的值
set var x=num //将变量x的值修改为num
这个在调试的时候不常用,了解一下即可。
4.总结
本文重点内容有三个:
一是Linux下默认release版本的可执行程序,需要加-g选项变成debug版本。
二是其中一些重要指令要记牢比如l,r,n,s,b,display等。
三。。。三连?欢迎大佬们的高质量评论,三连必回,冲冲冲。
- 点赞
- 收藏
- 关注作者
评论(0)