Welcome

首页 / 软件开发 / C++ / 功能强大的vc6调试器

功能强大的vc6调试器2011-04-09yy2better要成为一位优秀的软件工程师,调试能力必不可缺。本文将较详细介绍VC6调试器的主要 用法。

windows平台的调试器主要分为两大类:

1 用户模式(user-mode)调试 器:它们都基于win32 Debugging API,有使用方便的界面,主要用于调试用户模式下的应用 程序。这类调试器包括Visual C++调试器、WinDBG、BoundChecker、Borland C++ Builder调 试器、NTSD等。

2 内核模式(kernel-mode)调试器:内核调试器位于CPU和操作系统之 间,一旦启动,操作系统也会中止运行,主要用于调试驱动程序或用户模式调试器不易调试 的程序。这类调试器包括WDEB386、WinDBG和softice等。其中WinDBG和softice也可以调试用 户模式代码。

国外一位调试高手曾说,他70%调试时间是在用VC++,其余时间是使用 WinDBG和softice。毕竟,调试用户模式代码,VC6调试器的效率是非常高的。因此,我将首 先在本篇介绍VC6调试器的主要用法,其他调试器的用法及一些调试技能在后续文章中阐述。

一 位置断点(Location Breakpoint)

大家最常用的断点是普通的位置断点 ,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有 限。譬如下面这段代码:

void CForDebugDlg::OnOK()
{
for (int i = 0; i < 1000; i++) //A
{
int k = i * 10 - 2; //B
SendTo(k); //C
int tmp = DoSome(i); //D
int j = i / tmp; //E
}
}

执行此 函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以 最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断 点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以 轻易解决此问题。步骤如下。

1 Ctrl+B打开断点设置框,如下图:

Figure 1设置高 级位置断点

2 然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最 下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。

3 按F5重 新运行程序,程序中断。Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的 。因此,我们按步骤2所讲,更改此断点的skip次数,将1000改为513。

4 再次重新运 行程序,程序执行了513次循环,然后自动停在断点处。这时,我们就可以仔细查看DoSome是 如何返回0的。这样,你就避免了手指的痛苦,节省了时间。

再看位置断点其他修饰 条件。如Figure 1所示,在“Enter the expression to be evaluated:”下面, 可以输入一些条件,当这些条件满足时,断点才启动。譬如,刚才的程序,我们需要i为100 时程序停下来,我们就可以输入在编辑框中输入“i==100”。

另外,如果 在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。这对检测一个变量 何时被修改很方便,特别对一些大程序。

用好位置断点的修饰条件,可以大大方便解 决某些问题。