VC++高级调试技术

      在MFC中绝大多数的类都是从Cobject的类继承而来,虽然这只是一个虚基类,但它定义了很多成员函数,很多成员函数是用来支持程序调试的,如Dump,Assertvalid 等成员函数。另外他们都支持如TRACE,ASSERT等宏,并支持内存漏洞的检查乖等等.

1,TRACE宏的利用

TRACE宏有点像我们以前在C语言中用的printf,使程序在运行时输出一些调试信息,但TRACE宏中只有在调试状态下才有所输出。

2,ASSERT宏的利用

ASSERT宏的参数是一个逻辑表达式,在程序运行过程中,其该逻辑表达式为真,则不会发生任何动作,若些表达开为假,系统将弹出一个对话框警告你,并停止程序的执行,同时要求你作出选择:Abort,Ignore,Retry.

3,ASSERT_VALID宏的利用

ASSERT_VALID宏用来在运行时检查一个对象的内部合法性。ASSERT_VALID宏就是转化为对象的成员函数AssertValid()的调用,只是这种方法更安全。它的参数是一个对象指针,通过这个指针来调用它的AssertValid()函数。与此相配套,每当我们创建从Cobject类继承而来的一个新类时,我们可以重载该成员函数,以执行特定的合法性检查。

4,对象的Dump函数的利用

Dump函数用来按指定的格式输出一个对象的成员变量,来帮助你诊断一个对象的内部情况。与AssertValid成员函数一样,Dump也是Cobject类的成员函数。Dump函数的参数是一个CdumpContext对象,你可以像利用流一样,向这个对象中输入数据。当你创建一个Cobject继承而来的新类时,你可以按如下步骤重载你自己的Dump函数:
1,调用基类的Dump函数,以输出基类的内容;
2,向Cdumpcontest对象输出该类的数据。
典型的Dump函数定义:
#ifdef_DEBUG
void CPerson::Dump(CDumpContext&dc)const
{
  //call base class function first
   CObject::Dump(dc);
  //now do the stuff for our specific class
  dc<<"last name:"<<m_lastName<<"/n"
     <<"first name:"<<m_firstName<<"/n";
}
#endif
你可能已经注意到整个函数的定义都包含在#ifdef_DEBUG 和#endif中,这使得Dump成员函数只在DEBUG版本中发生作用,而对RELEASE版本不发生作用。

5,关于漏洞检查 

系统是怎样支持内在漏洞检查的?

其实在你的Debug版本中所有的有关内存分配的函数都是被重载过的,当你的程序申请内存时,它首先调用一般的内存分配函数分配一块稍大的内存块,在这一内存块中分为四个小块:Heap Information,buffer,User Memory block,buffer;第一块为有关堆的信息,比如,申请该内存的地点(文件名,行号),此内存块的类型(如整型,浮点,或某一类的对象)等。第二块是一个缓冲区,用于截获用户对其申请内存使用越界的情况。第三块是真正给用户的内存,返回的指针也是指向这儿。第四块也是一个缓冲区,作用同第二块。

漏洞检查的几个步骤:
在你所检测的程序段的开始处建立一个CmemoryState对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照。
在你所检测的程序段的末尾处再建立一个CmemoryState对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照。
再建立第三个CmemoryState对象,调用其成员函数Difference,把第一个CmemoryStae对象和第二个CmemoryState对象作为其参数,如果两次内存快照不相同,则该函数返回非零,说明此程序中有内存漏洞。我们来看一个典型的例子:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值