功能强大的vc6调试器.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:3 大小:22KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

功能强大的vc6调试器.doc

功能强大的vc6调试器.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

功能强大的vc6调试器作者:yy2better要成为一位优秀的软件工程师,调试能力必不可缺.本文将较详细介绍VC6调试器的主要用法.windows平台的调试器主要分为两大类:1用户模式(user-mode)调试器:它们都基于win32DebuggingAPI,有使用方便的界面,主要用于调试用户模式下的应用程序.这类调试器包括VisualC++调试器,WinDBG,BoundChecker,BorlandC++Builder调试器,NTSD等.2内核模式(kernel-mode)调试器:内核调试器位于CPU和操作系统之间,一旦启动,操作系统也会中止运行,主要用于调试驱动程序或用户模式调试器不易调试的程序.这类调试器包括WDEB386,WinDBG和softice等.其中WinDBG和softice也可以调试用户模式代码.国外一位调试高手曾说,他70%调试时间是在用VC++,其余时间是使用WinDBG和softice.毕竟,调试用户模式代码,VC6调试器的效率是非常高的.因此,我将首先在本篇介绍VC6调试器的主要用法,其他调试器的用法及一些调试技能在后续文章中阐述.一位置断点(LocationBreakpoint)大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点.但对于很多问题,这种朴素的断点作用有限.譬如下面这段代码:voidCForDebugDlg::OnOK(){for(inti=0;i<1000;i++){intk=i*10-2;//BSendTo(k);//Cinttmp=DoSome(i);//Dintj=i/tmp;//E}}//A执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次.这样手要不停的按,很痛苦.使用VC6断点修饰条件就可以轻易解决此问题.步骤如下.1Ctrl+B打开断点设置框,如下图:Figure1设置高级位置断点2然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了.3按F5重新运行程序,程序中断.Ctrl+B打开断点框,发现此断点后跟随一串说明:...487timesremaining.意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的.因此,我们按步骤2所讲,更改此断点的skip次数,将1000改为513.4再次重新运行程序,程序执行了513次循环,然后自动停在断点处.这时,我们就可以仔细查看DoSome是如何返回0的.这样,你就避免了手指的痛苦,节省了时间.再看位置断点其他修饰条件.如Figure1所示,在"Entertheexpressiontobeevaluated:"下面,可以输入一些条件,当这些条件满足时,断点才启动.譬如,刚才的程序,我们需要i为100时程序停下来,我们就可以输入在编辑框中输入"i==100".另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动.这对检测一个变量何时被修改很方便,特别对一些大程序.用好位置断点的修饰条件,可以大大方便解决某些问题.二数据断点(DataBreakpoint)软件调试过程中,有时会发现一些数据会莫名其妙的被修改掉(如一些数组的越界写导致覆盖了另外的变量),找出何处代码导致这块内存被更改是一件棘手的事情(如果没有调试器的帮助).恰当运用数据断点可以快速帮你定位何时何处这个数据被修改.譬如下面一段程序:#include"stdafx.h"#includeintmain(intargc,char*argv[]){charszName1[10];charszName2[4];strcpy(szName1,"shenzhen");printf("%s\n",szName1);strcpy(szName2,"vckbase");printf("%s\n",szName1);printf("%s\n",szName2);return0;}//A//B这段程序的输出是szName1:shenzhenszName1:aseszName2:vckbaseszName1何时被修改呢?因为没有明显的修改szName1代码.我们可以首先在A行设置普通断点,F5运行程序,程序停在A行.然后我们再设置一个数据断点.如下图:Figu