Linux——gdb调试器

目录

   前言:

二.gdb定义及指令:

如何查看该exe文件是否为Debug版本?两种方法:

三.gdb调试:

        调试指令1:l指令(小写L)

run指令:运行程序,相当于VS中的直接运行不调试——可简化输入r

 break指令:设置断点——指令可简化输入为b ​编辑 

info b指令:查看整个代码所有的断点信息

next指令:单条执行,相当于VS调试工具中的逐过程功能——可简化输入n

step指令:进入函数内部,相当于VS调试工具的逐语句功能——可简化输入s

continue指令:从当前位置的断点处跳到下一个断点处

 finish指令:gdb调试器自动停止调试,并且输出最终的代码执行结果。 

p+变量指令:可以查看当前变量的数值

display +变量指令:可以一直查看该变量的数值

 bt指令:查看当前所处函数栈帧的数据

delete breakpoints: 删除所有断点

delete breakpoints n: 删除序号为n的断点

disable breakpoints: 禁用断点

enable breakpoints: 启用断点


   前言:

         之前我介绍了Linux的编辑器vim,是专门用来编辑各种类型的语言代码。它主要使用的有3种模式,这三种模式涉及到的快捷键,设计方法极大的方便了我们编写代码,但是也只限于编写代码数据。

        然后又介绍了gcc/g++编译器,物如其名,它就是用来编译链接源文件进而生成可执行文件的。

        在Windows操作系统下,我们常用的编辑代码的软件有VS(Visual Studio)编译器,VS是一个基本完整的开发工具集,Visual Studio 旨在成为用于构建应用程序的功能丰富、强大且全面的解决方案,例如在该编译器下有着智能自动完成功能,可以帮助编程人员更快地输入代码;也有内置调试器,里面逐语句逐过程,断电功能帮助开发人员快速调试代码......。也就是说VS是编辑、编译、调试一体化的软件工具。

     

二.gdb定义及指令:

       在Linux操作系统中,调试代码又是一个单独的软件,叫gdb调试器。gdb调试器仍是Linux中没有的,需要使用yum指令去下载该软件:

sudo yum install -y gdb

子用户可以使用该指令,若子用户没有sudo权限,只能以root身份去下载

一般来说,GDB主要帮助你完成下面四个方面的功能:

1、按照自定义的方式启动运行需要调试的程序

2、可以使用指定位置和条件表达式的方式来设置断点
3、程序暂停时的值的监视
4、动态改变程序的执行环境 

 下载好后,我们需要回顾一下之前使用gcc/g++编译器,生成的可执行文件指令为:

gcc filename.c -o filename.exe

g++ filename.cpp -o filename.exe 

这两种指令默认的链接方式都是关联动态库,若要使用静态库链接,则需要如下:

gcc filename.c -o filename.exe -static

g++ filename.cpp -o filename.exe -static

 

 此外,gcc/g++默认生成的可执行文件类型是:release类型。

什么是release?

        Release 是“发行”的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率。Release版本的可执行文件体积会更小一些。

此外,除了Release版本,还有一种Debug版本。

        Debug 是“调试的意思”,Debug版本是程序开发人员用来测试代码的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化。

        根据上面了解的信息,我们若想使用gdb调试器对Debug类型的可执行文件进行调试就需要使用该指令:

gcc -g filename.c -o filename.exe 

                                -g选项是生成可执行文件是否为Debug的关键!

如何查看该exe文件是否为Debug版本?两种方法:

1.看这个文件的大小 (一般同文件的Debug版要比Release版字节大小要大一些):

如左图可知:上面的是Debug版本,大小为9888字节;下面的是Release版本,大小为8528字节。

2.通过指令查看: readelf -S 想要查看的文件名 grep debug (可以测试到该文件是否具备测试功能 

        上面绿色框中的内容就是Debug版本专属的具有调试功能的文件,这也是Debug版本比Release版本体积大的主要原因!         


三.gdb调试:

试验1:以下为写好的test.c文件代码,将通过该代码文件去调试

 

调试指令1:l指令(小写L)

l+数字:显示从代码的某一行开始的内容。

注:默认显示10行内容,再次输入l键按回车便可继续显示后面的内容。

 


run指令:运行程序,相当于VS中的直接运行不调试——可简化输入r


 break指令:设置断点——指令可简化输入为b  

info b指令:查看整个代码所有的断点信息

 


next指令:单条执行,相当于VS调试工具中的逐过程功能——可简化输入n

step指令:进入函数内部,相当于VS调试工具的逐语句功能——可简化输入s

注:使用这两个指令时,只能用于断点处运行时使用。该程序没有设置断点则不能用。

设置好断点后,输入run指令:

gdb会优先进入设置好的第一个断点,它处在第10行,所以进入第10行,这时我们采用n或s指令一步一步的往下执行。

因为是循环100次,所以会来回切换语句。


continue指令:从当前位置的断点处跳到下一个断点处

 

 


 finish指令:gdb调试器自动停止调试,并且输出最终的代码执行结果。 


p+变量指令:可以查看当前变量的数值

 

如上,进入该循环中,执行完该次循环后,使用p+变量指令就能显示当前变量的数值,但只显示一次。进入下一次循环后,还需要再使用p+变量才能再看到变量的数值变化。 

 


display +变量指令:可以一直查看该变量的数值

 

         如上,每次执行s或n指令进行循环时,gdb都会自动打印每次循环的变量sum和i的值,这个指令比上面的p+变量好很多哟~

display还可以查看变量的地址:

 

 

undisplay指令:删除之前对display变量的追踪

注:undisplay 跟的只能是变量的编号,跟其他没有用,如下:

 


 

 

 bt指令:查看当前所处函数栈帧的数据


 

delete breakpoints: 删除所有断点

delete breakpoints n: 删除序号为n的断点

disable breakpoints: 禁用断点

禁用断点并不会将该断点删掉,而是会让断点失效,断点所在代码所处痕迹仍在。

enable breakpoints: 启用断点

注:上面这些指令,若不加指定断点的编号,默认是包括所有断点的禁用,删除,启用!

 

 

 删除所有断点:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙予清的zzz~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值