C/C++代码调试的艺术(第2版)
上QQ阅读APP看书,第一时间看更新

2.2 断点管理

断点(breakpoint)在调试技术中最为重要,因此我们首先介绍与断点相关的技术。

断点是为了满足调试的需要而在程序中设置的特殊标志,代码执行到包含特殊标志的位置时会暂停,我们可以查看或者修改程序运行的一些信息,比如内存信息、堆栈信息等,还可以检查程序运行的结果,并且据此判断程序运行是否符合期望等。总而言之,断点就是程序中断(暂停运行)的地方。

2.2.1 设置/删除断点

在VC系列版本中,从VC6开始,设置断点的快捷键默认为F9,删除断点的默认快捷键也是F9。也就是说,F9是一个断点切换键,当被按下时,如果光标所在的代码行没有设置过断点,就会在光标处设置一个断点;如果光标所在的代码行已经设置过断点,就会删除对应的断点。我们可以在任意代码位置(甚至是代码注释行)设置断点,但是在启动调试以后,就只能在有效的代码行设置断点。

也可以通过菜单来设置断点,如图2-4所示,可以通过菜单“调试”→“切换断点”在第312行代码处设置一个断点。

图2-4 通过调试菜单设置断点

用户可以在程序启动前提前设置好断点,也可以在调试过程中随时设置新的断点或者删除断点。

2.2.2 禁用断点

对于一个暂时不需要的断点,可以将其删除或者禁用。删除和禁用断点的区别在于,如果一个断点被删除,该断点就会消失;如果一个断点被禁用,我们可以对被禁用的断点继续操作,比如重新启用断点,只是程序代码运行到被禁用的断点后并不会暂停下来。我们可以通过以下几种方式来禁用断点。

用鼠标右键点击菜单:在断点处单击鼠标右键,选择“禁用断点”命令即可禁用断点。如图2-5所示,在第302行代码对应的断点处单击鼠标右键并选择“禁用断点”命令后,该行的断点即被禁用。在断点被禁用后,断点的图标会从红色小圆点变成白色小圆圈。

图2-5 用鼠标右键单击菜单中的“禁用断点”命令

组合键:禁用断点和启用断点的组合键是Ctrl+F9,按下后即可禁用一个启用的断点,或者启用一个已经禁用的断点。该组合键与F9键类似,都是进行切换的功能。

2.2.3 查看所有断点

无论是在调试启动前还是调试过程中,都可以随时查看已经设置好的所有断点。VC提供了一个“断点”窗口,可以查看所有已经设置好的断点,如图2-6所示,通过菜单“调试”→“窗口”→“断点”,就会打开如图2-7所示的“断点”窗口。

图2-6 打开“断点”窗口

图2-7 “断点”窗口

在“断点”窗口中,可以很方便地对断点进行管理,比如删除某些断点、禁用/启用某些断点。需要说明的是,“断点”窗口中显示的是当前解决方案中所有项目的断点信息,而不是某一个项目的断点信息。比如,如果当前打开的解决方案中包含10个项目,那么10个项目中的所有断点都会被显示出来,如图2-8所示。

图2-8 解决方案中的所有断点

从图2-8中可以看出,一个断点的属性有很多,比如名称、标签、条件、进程等。名称属性就是源文件的文件名,后面是断点在该文件中的代码行号。标签属性是对断点有意义的描述(比如这个断点的用途),可以用来区分其他断点。尤其是当同一个文件有多个断点时,通过“断点”窗口很难直接看出各个断点的作用,如果给断点打一个标签,取一个有意义的名字,就会一目了然。条件属性是断点执行的条件。命中次数指的是在调试过程中,这个断点命中了多少次。进程属性指的是当前断点属于哪一个进程,只有在调试状态下才会显示。“断点”窗口非常有用,尤其是解决方案中有多个项目的时候,如果两个项目中的文件名都相同,根据进程属性就可以判断断点属于哪一个进程。我们来看一个调试状态下的“断点”窗口效果,如图2-9所示。

图2-9 同时调试多个进程的“断点”窗口

从图2-9中我们看到了一类特殊的断点图标,它既不是红色小圆点,也不是白色小圆圈,而是白色小圆圈外加一个惊叹号。这说明该断点不是启用状态,也不是禁用状态。这种图标表示该断点不会被命中,因为源代码所对应的调试符号没有被加载。调试符号在两种情况下不会被加载,一种是该断点对应的程序不处于调试状态,比如图2-9中标签为“test”的断点,它对应的程序是section_8.exe,但是section_8.exe并没有被调试,所以显示该图标;另外一种情况是虽然断点对应的程序已经启动,而且处于调试状态,但是由于各种原因(比如版本不匹配)没有办法成功加载,也会显示该图标。另外我们也看到了几个添加了标签属性的断点,比如有一个标签为“死锁调试”,则可以判断该断点的用途是调试死锁,可能是这个程序在某些情况下会发生死锁。进程属性显示了两个进程:chapter_2.exe和section_4.exe。这表示我们当前正在调试这两个进程,而且这两个进程都设置了断点。

后面的调试实践过程中还会涉及更多的断点细节,例如条件断点如何设置、什么是函数断点等,之后会有专门的章节来介绍相关知识。