您的位置:首页 > 编程语言 > C语言/C++

VC++调试技巧

2010-11-28 14:45 197 查看
一、诊断调试

VC++提供了: ASSERT 、ASSET_VALID 、 DEBUG_NEW 、TRACE 、VERIFY等宏.

1、ASSERT(Boolean Expression);

参数Expression是一个逻辑圾达式,若为真,则一切运行正常,若为假则程序停止运行,并且弹出一个“警告”对话框,对话框上有三个按钮,终止,重度,忽略,若选择终止,系统将停止调试。选择重试,系统将调用函数AfxDebugBreak(),并激活调试器,显示出断言失败的代码。若选择忽略,系统将会忽略该错误,继续运行程序,接下来可能出现更多致命错误。该宏只在Debug模式下起作用,在Release模式下将被忽略。

2、ASSET_VALID (pObject)用来确认CObject的派生类对象是否是有效对象,参数是一个对象指针。也是只在Debug模式下起作用,在Release模式下将被忽略。在Debug模式下,如果对象的指针为NULL,Visual C++会调用对象其成员函数AsserVaild()检测。当所有的检测都失败了,将会弹出各ASSERT一样的警告对话框.

3、TRACE宏也是在Debug模式下起作用,在Release模式下将被忽略。类似printf函数。例如:TRACE("x=%d/n",x);

当选择了Debug目标,并且afxTraceEnabled变量被置为真时,该宏就被激活了。

4、VERIFY(Boolean Expression);

参数Experssion是一个表达式或指针。在Debug模式下,该宏检测其参数。当表达式为0时,终止程序过行并弹出“Debug Assertion Failed”对话框,给出诊断信息。如果表达式的值为非0,程序正常运行。与其他宏不同的是,在Release模式下,该宏仍然起作用,但当参数表达式的值对0时,并不弹出“Debug Assertion Failed”对话框,也不终止程序运行。

二、启动内存泄漏检测机制

(1)开发人员要启动内存泄漏检测,首行必须加入代码:

#define _CRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

注意:#include语句的顺序,如果更改此顺序,所使用的函数可能无法正确工作。

#define 宏定义语句将CRT堆函数的基础版映射到对应的“调试”版。该语句不是必须的,但如果没有,那么有关内存泄漏的信息会不全。

cretdbg.h头文件可以将函数malloc()和free()映射到其调试版本的_malloc_dbg和_free_dbg,该函数会跟踪内存分配和释放。些映射关系只在调试Debug版本中有效,而发布Release版本使用普通的malloc()和free()函数。

添加了上述代码了以后,可以在程序要检测内存泄漏的地方加入函数_CrtDumpMemoryLeaks(),来报告内存泄漏信息。

例如:

#include<stdio.h>

#define _CRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

void main()

{

int *a=(int *)malloc(sizeof(int ));//动态分配空间

for(int i=0;i<100;i++)

{
a=(int *)realloc(a,(i+1)*sizeof(int ));

printf("%08x",(int)a);

a[i]=i+1;

}

for(i=0;i<100;i++)

printf("%5d",a[i]);

_CrtDumpMemoryLeaks();//报告内存泄漏函数

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: