调试(debug,消灭bug),就是寻找程序中的问题。本篇主要讲解vs 2022中实用的调试技巧。

一、bug起源

bug本意是昆虫”或“虫子”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或问题,简称程序漏洞。 “Bug”的创始⼈格蕾丝·赫柏(Grace Murray Hopper),她是⼀位为美国海军⼯作的电脑专家,1947年9⽉9日,格蕾丝·赫柏对Harvard Mark II设置好17000个继电器进⾏编程后,技术人员正在进行整机运行时,它突然停止了⼯作。于是他们爬上去找原因,发现这台巨大的计算机内部⼀组继电器的触点之间有⼀只飞蛾,这显然是由于⻜蛾受光和热的吸引,飞到了触点上,然后被⾼电压击死。所以在报告中,赫柏⽤胶条贴上⻜蛾,并把“bug”来表⽰“⼀个在电脑程序⾥的错误”,“Bug”这个说法⼀直沿⽤到今天。

二、Debug和Release

Debug,称为调试版本,包含调试信息,且不作任何优化,便于程序员调试程序。 Release,称为发布版本,进行了各种优化,使得程序在代码大小和运行速度上都是最优的,⽆需包含调试信息等,以便用户很好地使用。

三、调试快捷键

代码调试要在“Debug”版本中进行,只有选择调试(Debug)版本后方可进行一系列的调试操作。 常用快捷键如下:

CTRL+F5:开始执行不调试,即直接运行程序不进行调试过程。F10:逐过程执行,常用来处理⼀个过程,可以是⼀次函数调用,或是⼀条语句。F11:逐语句执行,每次执行⼀条语句,可使执行逻辑进入函数内部,观察函数内在细节。若使用F10,则会直接完成函数调用。F9:创建断点和取消断点,其可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂定执行,接着就可使用F10,F11等快捷键,观察代码的执行细节。条件断点:可设置条件触发断点。F5:启动调试,常用来直接跳到下⼀个断点处,⼀般和F9配合使用。存在多个断点时,F5只会跳到第一个断点处,若想跳至第二个断点,则需先取消第一个断点。 注:部分电脑的快捷键需搭配Fn使用,如 Fn+F9 快捷键才能创建和取消断点等。

四、监视和内存观察

只有在调试中才可以进行监视和内存观察操作。

监视:开始调试后,在菜单栏中【调试】->【窗⼝】->【监视】,打开任意⼀个监视窗口,输入想要观察的对象就行。

内存:开始调试后,在菜单栏中【调试】->【窗⼝】->【内存】,打开任意⼀个内存窗口,在地址栏输⼊:arr,&num,&c,这类地址,就能观察到该地址处的数据。

五、实例分析

在VS2022、X86、Debug的环境下,编译器不做任何优化的话,下面代码执行的结果:死循环

#include

int main()

{

int i = 0;

int arr[10] = { 0 };

for (i = 0; i <= 12; i++)

{

arr[i] = 0;

printf("hehe\n");

}

return 0;

}

原因分析: 1.栈区内存的使用习惯是从高地址向低地址使用的,所以变量i的地址是较大的。arr数组的地址整体是小于i的地址。 2. 数组在内存中的存放是:随着下标的增⻓,地址是由低到高变化的。所以根据代码,就能理解为什么是左边的代码布局了。如果是左边的内存布局,那随着数组下标的增⻓,往后越界就有可能覆盖到i,这样就可能造成死循环。 3.至于为什么i和arr数组之间恰好空出来2个整型的空间呢?在不同的编译器下可能中间的空出的空间大小是不⼀样的,代码中这些变量内存的分配和地址分配是编译器指定的,所以不同的编译器之间就会有所差异。

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。