BoundsChecker使用说明Word文档下载推荐.docx
- 文档编号:17366839
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:27
- 大小:432.53KB
BoundsChecker使用说明Word文档下载推荐.docx
《BoundsChecker使用说明Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《BoundsChecker使用说明Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
简单地说,当你的程序开始运行时,BoundsChecker的DLL被自动载入进程的地址空间,然后它会修改进程中对内存分配和释放的函数调用,让这些调用首先转入它的代码,然后再执行原来的代码。
BoundsChecker在做这些动作的时,无须修改被调试程序的源代码或工程配置文件,这使得使用它非常的简便、直接。
程序员在开发过程中可能会经常遇到这样的问题:
调试时语法没有问题,代码也没有错误,但应用程序运行就是不正常甚至死机,其实这有可能是由于逻辑错误引起的内存溢出或资源泄露等问题,这些错误一般是不容易被检测出来的。
而这类错误就是BoundsChecker错误检测范围之一。
通过对被测应用程序的操作,BoundsChecker提供清晰的、详细的程序错误分析,自动查明静态的堆栈错误及内存/资源泄露,并能够迅速的定位出错的源代码,即使在没有源代码的情况下也可检查第三方组件的错误。
BoundsChecker能检测的错误包括:
1)指针操作和内存、资源泄露错误。
比如:
内存泄露;
资源泄露;
对指针变量的错误操作。
2)内存操作方面的错误。
内存读、写溢出;
使用未初始化的内存。
3)API函数使用错误。
二、安装环境
BoundsChecker7.2支持的语言和主机平台包括C++,Delphi
WindowsNT,Windows95/98/2000
支持VisualC++6.0SP6,VisualStudio.NET2002,VisualStudio.NET2003。
安装说明:
1.首先请确定你已经卸载了旧版本的程序。
2.运行Setup目录中的文件进行安装。
3.启动安装程序,使用Setup/Crack目录中的bc72.dat文件注册程序。
4.完成即0K。
5.调试方式有两种
a.直接启动BC.exe
b.集成在VC中,启动VC的debug
BoundsChecker集成在6.0的菜单项和工具条的界面如下:
图
(1)菜单项
图
(2)工具条
三、BoundsChecker两种工作模式
使用BoundsChecker对程序的运行时错误进行检测,有两种使用模式可供选择。
一种模式叫做ActiveCheck,一种模式叫做FinalCheck。
下面分别进行介绍。
3.1ActiveCheck
ActiveCheck是BoundsChecker提供的一种方便、快捷的错误检测模式,它能检测的错误种类有限,只包括:
内存泄露错误、资源泄露错误、API函数使用错误。
要想使用ActiveCheck模式来检测程序的运行时错误,只需在VC++集成开发环境中打开BoundsChecker功能,然后从调试状态运行程序即可。
此时ActiveCheck会在后台自动运行,随时检测程序是否发生了错误。
下面说一下具体的使用步骤。
首先,在VC++集成开发环境中打开你要对其进行测试的程序,同时保证项目处于Debug编译状态下。
其次,确保VC++集成开发环境中[BoundsChecker/ErrorDetection]菜单项和[BoundsChecker/LogEvents]菜单项处于被选中的状态。
只有这两项被选中,BoundsChecker才会在程序运行过程中发挥作用。
最后,在VC++集成开发环境中选择[Build/StartDebug/Go]菜单命令,在Debug状态下运行程序,ActiveCheck也在后台开始运行了。
3.2FinalCheck
FinalCheck具有BoundsChecker提供的所有检错功能。
FinalCheck是ActiveCheck的超集,它除了能够检测出ActiveCheck能够检测出的错误,还能发现很多ActiveCheck不能检测到的错误,包括:
指针操作错误、内存操作溢出、使用未初始化的内存等等,并且,对于ActiveCheck能检测出的错误,FinalCheck能够给出关于错误更详细的信息。
所以,我们可以把FinalCheck认为是ActiveCheck的功能增强版。
我们付出的代价是:
程序的运行速度会变慢,有时甚至会变的很慢。
要想在FinalCheck模式下测试程序,不能使用VC++集成开发环境提供的编译连接器来构造程序,而必须要使用BoundsChecker提供的编译连接器来编译连接程序。
当BoundsChecker的编译连接器编译连接程序时,会向程序中插装一些错误检测代码,这也就是FinalCheck能够比ActiveCheck找到更多错误的原因。
下面就介绍一下如何在FinalCheck模式下对程序进行测试:
(1)在VC++集成开发环境中打开你所要测试的项目。
(2)由于要使用BoundsChecker的编译连接器重新编译连接程序,所以我们为BoundsChecker独自构造一个文件夹。
在VC++集成开发环境中,具体操作方法是:
A)点击[Build/Configurations...]菜单命令。
B)在弹出的对话框中点击Ad按钮。
在Configuration编辑框中添入你为BoundsChecker创建的文件夹的名称,这个名称是任意的,比如我们取名为BoundChecker。
C)在Copysettingsfrom组合框中选中XXX—Win32Debug项,然后点击OK按钮,接着点击Close按钮。
现在,我们已经为FinalCheck构造好了一个文件夹。
(3)点击[Build/SetActiveConfiguration…]菜单命令,选中你刚才为BoundsChecker建的文件夹,然后点击OK按钮。
这样BoundsChecker编译连接程序时生成的中间文件、可执行程序,都会被放到该文件夹下。
(4)选择[BoundsChecker/RebuildAllwithBoundsChecker]菜单命令,对程序重新进行编译连接,也就是在这时,BoundsChecker向被测程序的代码中加入了错误检测码。
编译连接完成后,BoundsChecker会在你为BoundsChecker构造的文件夹中生成可执行文件。
在FinalCheck模式下对程序进行检测的准备工作都已经做好,这时可以启动程序开始测试了,作步骤与在ActiveChecker模式下没什么区别。
具体步骤如下:
确保VC++集成开发环境中[BoundsChecker/ErrorDetection]菜单项和[BoundsChecker/LogEvents]菜单项处于选中状态,别外设置[BoundsChecker/Setting]MemoryTracking选项中的EnableFinalCheckt为选中状态。
点击[Build\StartDebug]菜单,选中“Go”菜单项。
程序开始在Debug状态下运行。
按照你制定好的测试用例,对程序进行操作。
当BoundsChecker检测到了错误时,会弹出窗口向你汇报,你可以当时就进行处理,也可以等到你的操作全部完成,退出程序之后再对列出的这些错误进行分析。
这完全取决于你是否选中了[BoundsChecker/DisplayErrorandPause]菜单项。
退出程序后,BoundsChecker会给出错误检测结果列表。
该错误列表与ActiveChecker给出的错误列表的查看方法完全一样。
只不过这个列表中所报告的信息会更多、更详细一些。
ActiveChecker、FinalCheck这两种模式,比较而言各有长短。
ActiveChecker使用方便,只需在Debug状态下直接运行程序即可,并且程序的运行速度较快,但检测的错误种类有限;
FinalCheck模式下,需要使用BoundsChecker的编译连接器重新编译连接生成可执行程序,并且程序的运行速度比较慢,但检测的错误种类、提供的错误相关信息要多于ActiveChecker。
所以,何时使用何种模式,应根据当时的具体情况而定。
四、特性和优点
1.资源泄漏检测:
BoundsChecker能够自动定位难以发现的内存泄漏,并监视堆栈和静态内存的状况。
这样就节约了你的时间,使您能够开发出更加可靠,不出问题的应用程序。
2.ActiveAPI检查:
该特点可以减少你的调试时间,提供工业中最为全面的WindowsAPI校验。
这样的结果就会带来更高质量的代码,在程序发布时就不会失败。
3.IDE集成:
BoundsChecker让你透明的调试。
它提供在C++中直接访问BoundsChecker的菜单,工具条和设置,使得开发人员能够立即修复错误。
4.兼容性检查:
BoundsChecker允许你轻松的生成和发布跨Microsoft平台的应用程序。
BoundsChecker在多平台上校验代码,然后产生一个报告指出所有与Windows平台兼容性相关的问题。
程序特点:
1.本地应用程序死锁检查
2.内存和资源查看器
3.COM调用报告
4.NET调用报告
5.垃圾收集(Garbagecollection)通知
BoundsChecker错误检测范围主要包括:
1).指针和泄露错误
接口泄露
内存泄露
资源泄露
未分配的指针错误
2).内存错误
动态存储溢出
无效的句柄被锁定
句柄没有被锁定
内存分配冲突
栈空间溢出
静态存储溢出
3).API和OLE错误
API函数返回失败
API函数未执行
无效的变量(包括指针变量、字符串变量等)
OLE接口方法的变量无效
OLE接口方法失败
线程调用库函数错误
五、检测示例
5.1内存泄漏检测示例
代码段
类TempClass.cpp;
TempClass:
:
TempClass()
{
cout<
<
"
构造对象TempClass"
endl;
}
voidTempClass:
Print()
TempClass.Print()"
#include"
stdafx.h"
OSTREAM.H"
TempClass.h"
intmain(intargc,char*argv[])
printf("
-----BoundsChecker用例-----------!
\n"
);
TempClass*myTempPoint=newTempClass();
//deletemyTempPoint;
//myTempPoint=NULL;
/*
if(NULL==myTempPoint)
{
cout<
为空"
}
else
myTempPoint->
Print();
}*/
return0;
图(3)测试结果窗口
双击者点击下方的标签进入到MemoryLeaks
图(4)MemoryLeaks窗口
图(5)MemoryLeak的详细资料
图(6)源代码窗口
结果表明在文件BoundChecker.cpp下main函数的11行myTempPoint已经分配分间而程序退出时发生了内存泄漏。
5.2野指针检测示例
deletemyTempPoint;
if(NULL==myTempPoint)
{
cout<
}
else
myTempPoint->
图(7)ActiveCheck模式下Debug的结果
在ActiveCheck模式下是无法检查到摇摆指针的
FinalCheck检测:
图(8)设置EnableFinalCheck选项
图(9)切换模式后debug目录下文件对比
图(10)FinalCheck模式下Debug的结果
结果表明在main函数myTempPoint为野指针,指针所指对象已经被释放。
5.3数组越界检测示例
intiArTemp[8];
for(inti=0;
i<
=8;
i++)
iArTemp[i]=i;
打印数组数据"
for(i=0;
iArTemp[i]<
这里选择DisplayErrorAndPause选项,所以在Debug过程中,将会即时弹出检查出的错误信息,如下图所示。
图(11)debug时弹出的错误信息
图(12)debug时弹出的错误信息
Explain:
获取帮助。
Memory/ResourceViewer:
查看内存和资源分配情况。
Suppress:
终止某类型的报错。
Debug:
切换到Debug窗口。
Halt:
中断。
Continue:
继续检测
Don’tShowthisError:
可以屏蔽某类型错误。
(下拉框可以选择条件)
DisableeventLogg:
是否将事件写入检测结果中。
图(13)检测结果
图(14)Errors选项的结果
结果表明在main()函数中局部变量iAriTemp发生读、写越界的错误,注意在ActiveCheck模式下是检查不到出数组越界,必需选择FinalCheck模式。
5.4GDI资源泄漏检测示例
voidCGDICheckerDlg:
OnPaint()
CPaintDCdc(this);
//devicecontextforpainting
CDCpDC;
pDC.CreateCompatibleDC(&
dc);
CRectrc;
GetClientRect(rc);
CBitmap*pOldBmp=NULL;
m_imgBk.LoadBitmap(IDB_TEST_BMP);
pOldBmp=pDC.SelectObject(&
m_imgBk);
dc.BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),&
pDC,0,0,SRCCOPY);
//pDC.SelectObject(pOldBmp);
图(15)GDI的测试结果
图(16)GDI资源泄漏
结果表明,释放DC时DC仍然占有对象的资源,同时也给出错误发生在OnPaint()函数中,对于GDI的资源泄漏也必需在FinalCheck模式下才可以检测出来。
5.5句柄资源泄漏检测示例
windows.h"
ostream.h"
DWORDWINAPITestThread(LPVOIDlpParameter);
intiIndex=0;
HANDLEhThread1;
hThread1=CreateThread(NULL,0,TestThread,NULL,0,NULL);
//CloseHandle(hThread1);
//ResourceLeak
while(iIndex++<
10)
mainThreadisrunning"
DWORDWINAPITestThread(LPVOIDlpParameter)
TestThreadisrunning"
图(17)测试结果
结果表明程序退出时发生了资源泄漏,资源被CreateThread分配。
5.6死锁检测示例
DWORDWINAPITestThread1(LPVOIDlpParameter);
DWORDWINAPITestThread2(LPVOIDlpParameter);
intiTickets=10;
CRITICAL_SECTIONg_csA;
CRITICAL_SECTIONg_csB;
HANDLEhThread2;
hThread1=CreateThread(NULL,0,TestThread1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,TestThread2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&
g_csA);
g_csB);
Sleep(4000);
DeleteCriticalSection(&
DWORDWINAPITestThread1(LPVOIDlpParameter)
while(TRUE)
EnterCriticalSection(&
Sleep(10);
if(iTickets>
0)
Sleep(10);
TestThread1SellTickets:
"
iTickets--<
LeaveCriticalSection(&
else
break;
DWORDWINAPITestThread2(LPVOIDlpParameter)
Sleep
(1);
Sleep
(1);
TestThread2SellTickets:
图(18)死锁测试结果
图(19)测试结果
图(18)和图(19)中可以看出线程Thread:
0x09EC拥有边界资源CriticalSection:
0x00431180,同时也在等待边界资源CriticalSection:
0x00431120的使用权。
但刚好线程Thread:
0x0C74拥有边界资源CriticalSection:
0x00431120却在等待CriticalSection:
0x00431180的使用权,所以两个线程都在等待对方释放资源。
5.7MSC-RuntimeLibrary内建的检测功能示例
MFC封装和利用了MSC-RuntimeLibrary的DebugFunction。
非MFC程序也可以利用MSC-RuntimeLibrary的DebugFunction加入内存泄漏的检测功能。
MSC-RuntimeLibrary在实现malloc/free,strdup等函数时已经内建了内存泄漏的检测功能。
要在非MFC程序中打开内存泄漏的检测功能非常容易,你只要在程序的入口处加入几行代码:
示例如下:
#include<
CRTDBG.H>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BoundsChecker 使用说明