VC6.0的调试功能

1、调试版本

调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。为了调试一个程序,首先必须使程序中包含调试信息。VC生成的可执行文件有两个版本,一种是调试版本即Win32  Debug,VC默认情况下是调试版本,内含调试代码,可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。另一种是发行版本即Win32 Release版本,此版本运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。设置版本类型的方法是:执行“biuld(编译)”—“Set Active Configuration”(配置),选择“Win32 Release”的配置。

 

Ymodem 调试工具_调试器

调试版本是在开发过程中使用的,用于检测程序中的错误;发布版本是最终结果,面向用户。调试版本中有编译器放在目标文件中的符号信息,记录了程序中的变量和函数的名字及其在源代码中的位置,通过这些符号信息,调试器可以将源代码的每一行与可执行代码中相应的指令联系起来。发布版本只包含编译器优化的可执行代码,没有符号信息,因此不能用调试器调试。

2、调试器

调试器是VC的重要部件,可以帮助程序员找到软件开发中可能遇到的几乎每一个错误。调试器调试的主要手段有设置断点、跟踪和观察。在程序中设置断点,在调试时使程序运行到断点处停下来,通过观察程序变量、表达式、内存、寄存器和堆栈的值来了解程序的运行情况,或进一步跟踪程序的运行。启动调试器,可以使用菜单命令、debug工具栏及快捷按钮方法。

1)快捷键

VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下:
 

快捷键

说明

F5(Go)

调试/继续运行

F10(Step over)

单步,如果遇到函数,不进入函数内部

F11(Step Into)

单步,如果遇到函数,则进入函数内部执行

CTRL+F10(Run to cursor)

运行到当前光标处。

F9(Insert|Remove Breakpoint)

设置断点/清除断点

Ctrl+Shift+F9

清除所有断点

Shift+F5(Stop Debugging)

结束调试

2)菜单命令

biuld(编译)菜单中---start debug(开始调试)下给出了调试的命令菜单。

一旦启动了调试器后,build菜单就会变成debug菜单。

3)debug工具栏

   在其它工具栏的任意位置单击右键,在弹出的菜单中选择“Debug”就打开了debug工具栏。

Ymodem 调试工具_调试器_02

Debug工具栏分为四个区:

Ymodem 调试工具_调试器_03

1、2区:是常用调试命令包括:

[1]  Restart:终止当前的调试过程,重新开始执行程序。

[2]  Shift + F5 Debug|Stop debugging 停止调试。

[3]  BreakExecution:终止程序运行,进入调试状态,多用于终止一个死循环。

[4]  Apply code changes:当源程序在调试过程中发生改变,重新进行编译。

[5]  Show next statement :显示下一语句。

[6]  F11 Debug|Step into 单步,进入函数体内部。

[7]  F10 Debug|Step over 单步,执行一行语句,不进入函数体内部。

[8]  shift+F11 Debug|Step out 从函数体内部运行出来。

[9]  Ctrl+F10 Debug|Run to cursor 运行到光标所在位置。

3区:

QuickWatch 快速查看变量或表达式的值

4区:6个图标,分别激活6个窗口

[1]  Watch观察窗口:用于观察指定变量或表达式的值。

[2]  Variables变量窗口:用于观察断点处或其附近的变量的值、

[3]  Register寄存器窗口:用于观察当前运行点的寄存器的内容。

[4]  Memory内存窗口:用于观察指定内存地址的内容。

[5]  Call stack调用栈窗口:用于观察调用栈中还未返回的被调用函数列表,当前函数位于最上边。

[6]  Disassmbly汇编代码窗口:显示被编译代码的汇编语言形式。

默认情况下,启动调试器时,自动打开Variables和Watch窗口。



3、调试步骤

1)按F9设置断点:常用的断点是普通的位置断点,将光标移到源程序的某一行,按F9就在当前光标处增加一个断点和取消一个断点。此时,本行代码前出现一个红色的大圆点,标志断点设置成功。

2)按F5键开始调试程序,运行到断点位置暂停,进入跟踪状态,暂停的语句(还未执行)位置前出现一个黄色的箭头。此时可以在变量窗口观察到当前环境下涉及的各个变量的值,而监视窗口中可以显示输入的变量和表达式的值。

3)继续按F10,单步执行,如果想进入自定义函数内部执行,应该按F11。

(此步也可以按Crtl+F10快速执行到光标位置,或直接再按F5程序会一直运行到结束或再次遇到断点。)

5)停止调试:Shift+F5。

 

4、调试举例


例1:用单步执行演示循环的执行过程

#include <stdio.h>
main()
{
    int i;     //循环控制变量
    int start; //循环初值
    int count; //记录循环执行的次数
 
    scanf("%d",&start);     //A
 
    for(count=0,i=start;i<100;i++)  //B
        count++;                      //C
 
    printf("循环执行的次数%d\n",count); //D
}

步骤:

1) 消除程序中的编译语法错误和警告。

2) 反复按F10单步执行程序。

观察:左边变量窗口中个变量的值的变化。

最后按F5键结束运行。

 

例2:用F11键单步调试带有函数的程序。

#include <stdio.h>
int Average(int x, int y); /*声明Average()函数*/ 
 
main()
{
    int a = 12;
    int b = 24;
    int ave = Average(a, b);    //A:设置断点
    printf("Average of %d and %d is %d.\n", a, b, ave); 
}
 
/*
   函数功能:    计算平均数
   函数入口参数: 整型x,存储第一个运算数
                  整型y,存储第二个运算数
   函数返回值:   平均数
*/
int Average(int x, int y)
{
    int result;
    result = (x + y) / 2;
    return result;
}

步骤:

1) 编译连接程序,消除错误和警告信息。

2) 在程序的A处设置断点;

3) 按F5键运行到断点,观察a,b,ave变量的值。

4) 按F11单步执行跟踪到函数Average内部执行,此时,变量窗口显示形参的值。

5) 继续按F11观察变量的变化,直到程序流程返回到main函数。

6) 最后按F5结束程序执行。