
最近的状态实在是不好,所以博客停更了一段时间。但是学习是没有停止的,所以这段时间知识又积累了一些。本着做笔记,为这段时间自己的学习进行复习巩固,也希望能解决一些朋友关于这方面知识的疑惑。
在学习c语言的时候,我们调用vs2019对程序进行调试的时候,就已经接触到了release和debug版本。
我们发现:在windows操作系统下,debug版本可调试,是面向程序员的,而release版本代码较debug版本有所优化,占取内存较小,不可调试,是面向用户的。
Linux下也是如此。
在使用gcc工具的时候,加 **-g**指令即可

并且可以发现,可调试版本的可执行文件比不可调试版本的可执行文件所占据内存的大小要更大

mytest文件是可调试版本的可执行文件
test文件是不可调试版本的可执行文件
F5:调试运行/开始调试,无断点时直接运行程序,有断点时光标停止在第一个断点处。特别地,一直F5会逐断点调试直至程序结束,也就是可以从第一个断点到第二个断点,再从第二个断点到第三个断点,以此类推。
ctrl+F5:开始执行不调试
shift+F5:取消调试/停止调试
在开始使用gdb工具可能会遇到的问题

如果出现gdb 遇到No symbol table is loaded Use the file command的问题:
1.没有生成可调试的文件
命令行:gcc -o 可调试文件的文件名 被编译的.c文件 -g
2.没有在使用gdb命令后加可调试文件名称

该命令默认一次只出现10行,如果想要展示全部的代码,按回车继续操作直到代码全部显示完毕。


删除前查看所有断点的信息

删除某个特点的断点后,查看所有的断点的信息

设置三个断点测试该条命令:

a.程序运行到断点四处

显示程序停止到断点四处停止,如果还想再想使得程序重新运行,再执行r命令,则会出现是否重新开始程序的选择。
b.删除断点四,程序运行停止到断点五。那么,删除断点五,程序运行停止到断点六。
c.如果删去全部的断点,那么程序直接运行结束。
简单地将,r的功能是程序开始运行,并且运行到第一个断点处停止。与之配套使用的是continue。
这里为了能够更好地显示n的功能,在已有的代码上增加了一个求两数之和的函数。

a.设置一个断点,执行r命令使得程序开始执行到断点处。
这里为了更好地可以展示效果,就把main函数中的第一行程序设置为断点的行数。

b.当程序执行起来,使用n指令,该指令是逐过程调试,当遇到函数调用时不进入直接跳过。

a.设置一个断点,执行r命令使得程序开始执行到断点处。
这里为了更好地可以展示效果,就把main函数中的第一行程序设置为断点的行数。

b.当程序运行起来,执行s指令,程序便逐语句地一行一行地进行。


a.设置全部断点,r开始使得程序运行,并且运行停止于第一个断点处。

b.使用continue,从第一个断点到第二个断点执行程序。

c.继续使用,从第二个断点到第三个断点执行程序。

d.如果程序运行停止到最后一个断点处停止,会出现怎样的效果?

可以看到程序直接运行结束。
finish用于函数跳出返回,英文的含义是在main中,用finish是没有意义的,只有进到子函数里用finish才有意义。
为了,便于测试该指令的功能,同样还是修改了test.c文件。

a.为了便于调试,直接在调用子函数的那一行设置断点。

b.调用s指令逐行调试,进入到子函数的内部。

c.在子函数内部使用finish指令,直接结束子函数的调用。

d.返回到主函数内部,再使用finish指令,发现不可得。



这里要注意的是:设置常变量的时候要跟变量名称,而取消常变量的时候要跟设置常变量的编号。

不难发现,p监视变量值只有在使用p指令的时候显示,而不像常变量那样每一步都会执行。且在p监视变量时要明确跟变量名,如果不跟,那么p指定显示最近刚监视的变量的值。

为了便于测试,再次修改test.c的内容。


使能的意思是指该断点是否起效。一般设置断点后均默认其使能,如果要关闭断点的使能就使用disable breakpoints 断点编号此条命令。
