1、 1 VC 程序调试 在开发程序的过程中,经常需要查找程序中的错误,这就需要利用调试工具来帮助你进行程序的调试,当然目前有许多调试工具,而集成在 VC 中的调试工具以其强大的功能,一定使你爱不释手。下面我们先来介绍 VC 中的调试工具的使用。 1 VC 调试工具 1 1 调试环境的建立 在 VC 中每当建立一个工程 (Project)时 ,VC 都会自动建立两个版本: Release 版本 ,和Debug 版本 ,正如其字面意思所说的, Release 版本是当程序完成后 ,准备发行时用来编译的版本 ,而 Debug 版本是用在开发过程 中进行调试时所用的版本。 DEBUG 版本当中,包含着
2、MICROSOFT 格式的调试信息,不进行任何代码优化,而在 RELEASE 版本对可执行程序的二进制代码进行了优化,但是其中不包含任何的调试信息。 在新建立的工程中,你所看到是 DEBUG 版本,若要选择 RELEASE 版本,可以选择菜单 PROJECT 中的 SETTING 命令,这时屏幕上面弹出 PROJECT SETTEING 对话框,在 SETTING FOR 下拉列表中选择 RELEASE,按 OK 退出 ,如图 4.1。 图 4.1 在调试程序的时候必须使用 DEBUG 版本,我们可以在 Project Setting 对话框的 C/C+页中设置调试选项。 2 图 4.2 各个
3、选项的含意如下: Program Database 表示产生一个存储程序信息的数据文件 (.PDB),它包含了类型信息和符号化的调试信息; Line Numbers Only 表示程序经过编译和链接产生的 .OBJ 或 .EXE 文件仅仅包含全局和外部符号以及行号信息; C7 Compatible 表示产生一个 .OBJ 或 .EXE 文件行号信息以及符号化的调试信息; None 表示不 产生任何调试信息。 1 2 调试的一般过程 调试,说到底就是在程序的运行过程的某一阶段观测程序的状态 ,而在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。所以我们所做的第一项工作就是设立断点
4、。其次 ,再运行程序 ,当程序在设立断点处停下来时 ,再利用各种工具观察程序的状态。程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向,所以下面我们依次来介绍断点的设置,如何控制程序的运行以及各种观察工具的利用。 1 3 如何设置断点 在 VC 中,你可以设置多种类型的断点,我们可 以根据断点起作用的方式把这些断点分为三类 :1、与位置有关的断点; 2、与逻辑条件有关的断点 3、与 WINDOWS 消息有关的断点 ,下面我们分别介绍这三类断点。 首先我们介绍与位置有关的断点 。 3 1、 最简单的是设置一般位置断点,你只要把光标移到你要设断点的位置,当然这一行必
5、须包含一条有效语句的;然后按工具条上的 add/remove breakpoint 按钮或 按快捷键 F9;这时你将会在屏幕上看到在这一行的左边出现一个红色的圆点表示这设立了一个断点。 图 4.3 2 、有的时候你可能并不需要程序每次运行到这儿都停 下来,而是在满足一定条件的情况下才停下来,这时你就需要设置一种与位置有关的逻辑断点。要设置这种断点我们只需要从 EDIT 菜单中选中 breakpoint 命令,这时 Breakpoint 对话框将会出现在屏幕上。选中 Breakpoint 对话框中的 LOCATION 标签,使 LOCATION 页面弹出,如图 4.4 图 4.4 单击 cond
6、ition 按钮,弹出 Breakpoint 对话框,在 Expression 编辑框中写出你的逻辑 4 表达式,如 X=3 或 a+b25,最后按 OK 返回。 图 4.5 这种断点 主要是由其位置发生作用的,但也结合了逻辑条件,使之更灵活。 3、有时我们需要更深入地调试程序,我们需要进入程序的汇编代码,因此我们需要在在汇编代码上设立断点:要设立这种断点我们只需从 View 菜单中选 Debug window 命令 。 图 4.6 再选 Disassembly 子命令,这时汇编窗口将会出现在屏幕上。 5 图 4.7 在图 4.7 中的汇编窗口中你将看到对应于源程序的汇编代码,其中源程序是用黑
7、体字显示,下面是且对应的汇编代码。要设立断点,我们只需将光标移到你想设断点处然后点击工具条上的 Insert/Remove Breakpoints 按钮,此后你将会看到一个红圆点出现在该汇编代码的右边。 图 4.8 上面所讲的断点主要是由于其位置发挥作用的,即当程序运行到设立断点的地方时程序将会停下来。但有时我们设立只与逻辑条件有关的断点,而与位置无关。 6 所以下面介绍一下与逻辑条件有关的断点。 ( 1)逻辑条件触发断点的设置: 从 EDIT 菜单中选中 breakpoint 命令,这时屏幕上将会出现 Breakpoint 对话框。 图 4.9 选中 Breakpoint 对话框中的 DAT
8、A 标签,对应的 页面将会弹出 。 图 4.10 在图 4.10 的 DATA 页面中的 Expression 编辑框中写出你的逻辑表达式,如 (X=3); 7 图 4.11 最后按 OK 返回。 其他几种断点的设置的方法都与之类似。我们一一加以说明。 ( 2)监视表达式发生变化断点: 从 EDIT 菜单中选中 breakpoint 命令,这时屏幕上将会出现 Breakpoint 对话框。 选中 Breakpoint 对话框中的 DATA 标签,对应的页面将会弹出 。 在 Expression 编辑框中写出你需要监视的 表达式 。 最后按 OK 键返回。 ( 3)监视数组发生变化的断点: 从
9、EDIT 菜单中选中 breakpoint 命令,这时屏幕上将会 出现 Breakpoint 对话框。 选中 Breakpoint 对话框中的 DATA 标签,对应的页面将会弹出 。 在 Expression 编辑框中写出你需要监视数组名。 在 Number of Elements 编辑框输入你需要监视数组元素的个数。 按 OK 键返回。 ( 4)监视由指针指向的数组发生变化的断点: 从 EDIT 菜单中选中 breakpoint 命令,这时在屏幕上将会出现 Breakpoint对话框。 选中 Breakpoint 对话框中的 DATA 标签; 在 Expression 编辑框中输入形如 *p
10、ointname,其中 *pointname 为指针变量名; 在 Number of Elements 编辑框输入你需要监视数组元素的个数; 8 按 OK 键返回。 ( 5)监视外部变量发生变化的断点: 从 EDIT 菜单中选中 breakpoint 命令这时屏幕上将会出现 Breakpoint 对话框; 选中 Breakpoint 对话框中的 DATA 标签; 在 Expression 编辑框中输入变量名; 点击在 Expression 编辑框的右边的下拉键头; 选取 Advanced 选项,这时 Advanced Breakpoint 对话框出现; 在 context 框中输入对应的函数名
11、和 (如果需要的话 )文件名; 按 OK 键关闭 Advanced Breakpoint 对话框。 按 OK 键关闭 Breakpoints 对话框。 ( 6)在讲了位置断点和逻辑断点之后我们再讲一下与 WINDOWS 消息有关的断点。 注 意:此类断点只能工作在 x86 或 Pentium 系统上。 从 EDIT 菜单中选中 breakpoint 命令,这时屏幕上将会出现 Breakpoint 对话框; 选中 Breakpoint 对话框中的 MESSAGE 标签,对应的页面将会弹出; 在 Break At WndProc 编辑框中输入 Windows 函数的名称; 在 Set One Br
12、eakpoint From Each Message To Watch 下拉列表框中选择对应的消息; 按 OK 返回。 1 4 控制程序的运行 上面我们讲了如何设置各类断点,下面我们来介绍如何控制程序的运行。当我们从菜单Build 到子菜单 Start Debuging 选择 Go 程序开始运行在 Debug 状态下,程序会由于断点而停顿下来后,可以看到有一个小箭头,它指向即将执行的代码。 图 4.12 9 随后,我们就可以按要求来控制程序的运行:其中有四条命令: Step over, step Into , Step Out ,Run to Cursor。 图 4.13 在图 4.13 中
13、: Step over 的功能是运行当前箭头指向的代码 (只运行一条 代码 )。 Step Into 的功能是如果当前箭头所指的代码是一个函数的调用,则用 Step Into 进入该函数进行单步执行。 Step Out 的功能是如当前箭头所指向的代码是在某一函数内,用它使程序运行至函数返回处。 Run to Cursor 的功能是使程序运行至光标所指的代码处。 1 5 查看工具的使用 调试过程中最重要的是要观察程序在运行过程中的状态,这样我们才能找出程序的错误之处。这里所说的状态包括各变量的值,寄存中的值 ,内存中的值,堆栈中的值 ,为此我们需要利用各种工具来帮助我们察看程序 的状态。 弹出式
14、调试信息泡泡 (Data Tips Pop_up Information)。 当程序在断点停下来后,要观察一个变量或表达式的值的最容易的方法是利用调试信息泡泡。要看一个变量的值,只需在源程序窗口中,将鼠标放到该变量上 ,你将会看到一个信息泡泡弹出,其中显示出该变量的值。 10 图 4.14 要查看一个表达式的值,先选中该表达式,仍后将鼠标放到选中的表达式上,同样会看到一个信息泡泡弹出以显示该表达式的值如图 4.15 所示。 图 4.15 变量窗口 (VARIABLE WINDOW)。 在 VIEW 菜单, Debug window 选 Variables window; 变量窗口将出现在屏幕上。其中显示着变量名及其对应的值。你将会看到在变量观察窗口的下部有三个标签: AUTO ,LOCAL,THIS 选中不同的标签,不同类型的变量将会显示在该窗口中。