本篇博客主要讲解程序员最应该掌握的技能之一——调试。我个人认为,学习编程,有2件事情非常重要,一是画图,一是调试。下面我会以Visual Studio 2022为例(VS的其他版本大同小异),演示如何调试一个C/C++代码。
快捷键
常用的快捷键一定要记住!主要有以下4个:
- F9打断点,配合F5开始调试。
- F10逐过程,F11逐语句。
如果愿意记忆的话,可以再记2个:
- ctrl+F5,开始执行,不调试。
- shift+F5,结束调试。
以上4+2个快捷键,如果大家使用VS2022编写C/C++代码,希望能够牢牢记住,反复使用。我每次使用这几个快捷键,都是手指往那个方向一按,都形成肌肉记忆了。
下面依次讲解这几个键的作用。
先讲最简单的,ctrl+F5,你只要一按下,程序就开始执行了。注意这个快捷键并不能调试,它只是单纯的执行你的代码。
如果你想要调试要怎么办呢?一个标准的流程是:
先设置断点。你也可以在调试起来后,再设置。设置断点的方式很简单,用鼠标点到你想设置断点的那一条语句上,然后按F9。比如:
我用鼠标点到了15行上,然后按了F9,就可以看到15行上出现了一个红点,说明设置断点成功了。
断点有什么用呢?当你调试起来后,每次执行到断点处,就会停下来。而按F5就可以开始调试。我按一个F5:
可以看到代码直接执行到了第15行,由于遇到了断点,就停了下来。再看看输出窗口:
此时只执行了“打印1~10”这个逻辑。
那如果我想继续向下执行呢?你每按一下F10,就会执行一条语句。
先按一下F10:
代码执行了第15行的语句,在屏幕上打印了“a = 10, b = 20”,即将执行第16行语句。注意,左边的“箭头”表示的是即将执行的语句。
再按一下F10:
再按一下F10:
那F10和F11有什么区别呢?在绝大多数情况下是没有区别的,但是遇到函数调用语句时,按F10会直接执行完这条语句,是不会进入这个函数的。但是F11会进入函数。举个例子:
对于以下代码,我先在第17行打个断点:
然后按F5执行到这个断点处:
此时我有2种选择:第一种,按F10,就会直接执行函数调用,代码会来到第18行:
重新开始一次调试,此时在相同的情况下,我按F11,就会直接进入Print函数内部:
这样就可以观察Print函数内部的执行细节。
最后说一下,如果你想停止调试,就按shift+F5:
可以看到,这个进程直接被干掉了。
信息窗口
光知道如何让代码执行到想要的位置是不够的,还要能够观察一些细节,比如变量的值、函数的调用逻辑、内存中的值等等,这就需要用到信息窗口。主要的信息窗口有(这里只列举我最常用到的):
- 监视窗口,用于观察变量和表达式的值。
- 内存窗口,用于观察内存中的值。
- 调用堆栈窗口,用于观察函数之间的调用逻辑。
这些窗口都可以在调试起来后在调试–>窗口中找到。其他的窗口都有他们独特的用处,大家可以自行摸索。其实,我选择VS系列来讲解调试的一个重要原因,就是因为它好上手,很容易调试代码。如果使用gdb等工具来调试代码,不适合新手入门,而且很不方便。
先说监视窗口,这里可以监视各个变量和表达式的值:
而内存窗口可以观察内存,比如观察a在内存中的分布:
最后再提一下调用堆栈,可以观察函数的调用逻辑,比如:
可以观察到,main函数调用test1,test1调用test2,test2调用test3。
总结
- 说一千道一万,大家一定要多动手调试!调试!调试!!!
- 常用的快捷键有F9, F5, F10, F11, ctrl+F5, shift+F5等等。
- 如果要让一个程序运行起来,不调试,按ctrl+F5。
- 一般来说,会先使用F9打断点,再按F5,程序就会开始执行,直到遇到断点或者程序结束时就停下来。
- 如果想逐过程执行,按F10,就会执行下一条语句,遇到函数不会进入函数。
- 如果想逐语句执行,按F11,就会执行下一条语句,遇到函数会进入函数。
- 常用的信息窗口有:监视窗口、内存窗口、调用堆栈窗口,分别用来观察变量和表达式的值、观察内存中的值、观察函数之间的调用逻辑。
- 最后再提一遍:动手调试!!!
感谢大家的阅读!