目录
前言:
二.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: 启用断点
注:上面这些指令,若不加指定断点的编号,默认是包括所有断点的禁用,删除,启用!
删除所有断点: