Linux下代码调试器---gdb的使用

举报
卖寂寞的小男孩 发表于 2022/10/02 09:35:55 2022/10/02
【摘要】 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等。
三。。。三连?欢迎大佬们的高质量评论,三连必回,冲冲冲。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。