VS2019代码运行后的调试
当我们直接去运行代码的时候,是从main函数开始,依次的往下直接执行下去,直到执行完最后一句代码
但是有的时候,这个输出结果和我们预期的是不一样的,或者程序挂掉了,怎么办呢?
这时候我们就要调试,让代码停下来,一行一行的往后执行,执行当这一行的时候,停下来看看这一行所产生的变量的中间值和我们的预期是不是一样的。
我们可以让程序调试启动以后,在任意一行代码停下来。
我们只需要给相应的行数打上断点就可以了。
断点:让程序调试起来之后在这一句代码停住。
我们来看看怎么操作:
方法1:快捷操作:是我们把鼠标移到这行代码的左侧,用鼠标点,打上1个红点,我们可以在多个行打红点。
方法2:快捷键:F9
我们把鼠标移到要打断点的那一行末尾,然后按F9,就打断点了。
打完断点后
我们要开启调试,(快捷键是:F5)
我们看到启动调试后,红色的圆圈里有黄色的箭头,指向的这一行就是我们当前的代码调试起来停下来的这一行,这一行还未运行。
调试起来,我们怎么让代码一行一行的往下走呢?
我们看最上面的一行:
逐语句(F11)
逐过程(F10)
跳出(Shift+F11)
现在我们点击一下“逐过程”,或者F10
我们看到黄色箭头跳到下一行了,
下面显示的是常用的窗口,我们还有一个窗口,我们点击“菜单”的监视窗口
我们还有一个窗口–内存的窗口
内存窗口:特别是指针和内存管理的问题。
监视窗口:一行一行的,我们可以在里面输入变量
a是10,因为箭头指向的代码还没有执行,所以b是随机值
我们再点击“逐过程”
我们还可以查看a,b的内存的地址
我们可以把变量的内存地址复制起来跑到内存窗口去:
把地址输到窗口里,然后敲回车
根据显示的十六进制计算出十进制的值
因为函数进行是一个压栈的过程,先压的a在栈底,地址高,后压的b在栈顶,地址低。
低地址放低字节,高地址放高字节,这个系统是小端的。
当我们调试到第36行的时候,如果我们想要进入到sum这个函数,怎么做?
我们点击“逐语句”,或者快捷键:F11
我们看到黄色箭头就跳到sum函数这里了,我们点击“逐过程”或者快捷键:F10,跳到下一句代码
再按F10
再按F10
如果我们在调试的时候,中间的代码不想调试了,想直接跳到下一个断点处,该怎么办?
点击“跳出”或者按快捷键:Shift+F11
调试的总结
调试的应用示例1
代码执行的结果和我们的预期不一样,我们开始调试!
我们打断点(F9),启动调试(F10)
然后继续按F10,执行到下一句代码
然后继续按F10,执行到下一句代码
我们可以在监视窗口看a,b现在的值
都没有问题。现在我们要进入sum函数,按F11
然后按F10,执行到下一句代码
我们把鼠标放在变量名上,也会显示出此时a,b的值是多少‘
result怎么是-10???我们往后一看,原来是把+号写成-号了
调试的应用示例2
程序挂掉了
怎么办?我们开始调试!
我们从main函数第一行打断点(F9),然后启动调试(F5)
按F10,执行到下一步
我们按F11,进入函数看看
然后按F10,执行到下一步
我们打开监视器窗口看看
因为这些变量不在这个函数上,我们按DELETE键删除掉,然后输入p,看看这个p指针的值
为什么p是空的?因为现在是让代码停下来,当前行代码还没有执行呢
我们按F10,执行到下一步
现在这个p指针有指向内存了
VS2019上,对栈上的内存的初始化是
VS2019上,对堆上的内存的初始化是
然后我们按F10,执行到下一步
现在这个函数执行完了,但是我们现在看,这个监视器里的p的值怎么变为空了?
怎么执行完,回到主函数上,p变为空了?
然后我们继续按F10,执行到下一步看看
把helloworld往空地址上拷贝
0地址是禁止访问的,更别说写了!!!程序就挂掉了
所以,我们知道,代码挂在第40行
我们改为正确代码:
成功了