BoundsChecker 内存泄露 检测 简易使用教程

来源:互联网 发布:java程序员壁纸 编辑:程序博客网 时间:2024/05/16 08:14

BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。 BoundsChecker能检测的错误包括: 1)指针操作和内存、资源泄露错误,比如:内存泄露;资源泄露;对指针变量的错误操作。 2)内存操作方面的错误,比如:内存读、写溢出;使用未初始化的内存。 3)API函数使用错误。 使用BoundsChecker对程序的运行时错误进行检测,有两种使用模式可供选择。一种模式叫做ActiveCheck,一种模式叫做FinalCheck。下面分别进行介绍。 1)ActiveCheck是BoundsChecker提供的一种方便、快捷的错误检测模式,它能检测的错误种类有限,只包括:内存泄露错误、资源泄露错误、API函数使用错误。要想使用ActiveCheck模式来检测程序的运行时错误,只需在VC++集成开发环境中打开BoundsChecker功能,然后从调试状态运行程序即可。此时ActiveCheck会在后台自动运行,随时检测程序是否发生了错误。下面说一下具体的使用步骤。 首先,在VC++集成开发环境中打开你要对其进行测试的程序,同时保证项目处于Debug编译状态下。 其 次,确保VC++集成开发环境中[BoundsChecker/Integrated Debugging]菜单项和[BoundsChecker/Report Errors and Events]菜单项处于被选中的状态。只有这两项被选中,BoundsChecker才会在程序运行过程中发挥作用。 最后,在VC++集成开发环境中选择[Build/ Start Debug/Go]菜单命令,在Debug状态下运行程序,ActiveCheck也在后台开始运行了。 2)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)在弹出的对话框中点击 Add 按钮。在Configuration 编辑框中添入你为BoundsChecker创建的文件夹的名称,这个名称是任意的,比如我们取名为BoundChecker。 C)在 Copy settings from组合框中选中XXX—Win32 Debug项,然后点击OK按钮,接着点击Close按钮。现在,我们已经为FinalCheck构造好了一个文件夹。 3) 点击[Build/Set Active Configuration…] 菜单命令,选中你刚才为BoundsChecker建的文件夹,然后点击OK按钮。这样BoundsChecker编译连接程序时生成的中间文件、可执行程序,都会被放到该文件夹下。 4)选择[BoundsChecker/Rebuild All with BoundsChecker] 菜单命令,对程序重新进行编译连接,也就是在这时,BoundsChecker向被测程序的代码中加入了错误检测码。编译连接完成后, BoundsChecker会在你为BoundsChecker构造的文件夹中生成可执行文件。 在FinalCheck模式下对程序进行检测的准备工作都已经做好,这时可以启动程序开始测试了,作步骤与在ActiveChecker模式下没什么区别。具体步骤如下:确保VC++集成开发环境中[BoundsChecker/ Integrated Debugging]菜单项和[BoundsChecker/Report Errors and Events]菜单项处于选中状态。点击[ Build/Start Debug]菜单,选中“Go” 菜单项。程序开始在Debug状态下运行。按照你制定好的测试用例,对程序进行操作。当BoundsChecker 检测到了错误时,会弹出窗口向你汇报,你可以当时就进行处理,也可以等到你的操作全部完成,退出程序之后再对列出的这些错误进行分析。这完全取决于你是否 选中了[BoundsChecker/Report Errors Immediately] 菜单项。 退出程序后,BoundsChecker会给出错误检测结果列表。该错误列表与ActiveChecker给出的错误列表的查看方法完全一样。只不过这个列表中所报告的信息会更多、更详细一些。 好 了,BoundsChecker在FinalCheck模式下的使用也介绍完了。ActiveChecker、FinalCheck这两种模式,比较而言 各有长短。ActiveChecker使用方便,只需在Debug状态下直接运行程序即可,并且程序的运行速度较快,但检测的错误种类有限; FinalCheck模式下,需要使用BoundsChecker的编译连接器重新编译连接生成可执行程序,并且程序的运行速度比较慢,但检测的错误种 类、提供的错误相关信息要多于ActiveChecker。所以,何时使用何种模式,应根据当时的具体情况而定.

接口做完了,当然要好好测一下了,何况原来就发现过内存泄露的问题。 原来的问题是绘出的帧数,随着运行时间的增加会慢慢减少,这在dof节点上表现尤为明显。考虑到有内存泄露,我们决定采用boundchecker来进行测试。 刚开始装的时候我们还小心翼翼的,怕这种可以调试系统的会一不小心破坏掉系统,那可就赔了夫人又折兵了。但是yyd装了之后发现一切正常,于是才敢装起来。 下面就是尝试使用了,不管三七二十一,先跑上一段程序看看。开了boundschecker开始debug,立刻发现boundschecker开始报错,我的天,好多,上万条。怎么回事呢?难道我们的程序那么烂吗?仔细研究一下发现,原来boundschecker也是需要好好配置一下的,默认方式下开启了好多检查,又有一个到现在也没弄明白的一套rules,于是就出了这么多东西。于是我们把Data collection,API call reporting,Call validation,COM call reporting,COM object tracking,Deadlock analysis,.Net analysis,.Net call reporting,Resource tracking,全部关掉,只剩一个Memory Tracking,用来检查内存泄露,果然报错迅速减少,察看以后发现boundschecker还是有点乱报错,不都是我们想要的,索性不去管它,专心致志于memory leak。 咦?怎么没有内存泄露呢?怎么可能呢?找啊找,发现原来我没有开final check,这样从原理上讲,在系统运行期间分配了内存,但是在退出程序的时候可能没有释放,但是因为不做final check,所以根本不可能发现内存泄露,在程序运行期间,boundschecker 是不知道你是否要释放掉某一块空间的,事实上也不可能知道。 打开final check,突然发现程序启动不起来了,考验我的耐心?我等。功夫不负有心人,等了两个小时,画面终于出现了,只有2.2HZ,这显然是无法接受的。找原因.......找啊找,还是不知道。 这时候突然系统报告说磁盘空间已满,这显然是怪异的,我每个分区都至少有几个G的空间,怎么可能满呢?过去察看一下,发现在临时目录里边有个4个G的文件。idx10.tmp,nml1.tmp,stg11.tmp这三个文件就是boundschecker 做出来的,当时具体是哪个比较大记不清了,反正是其中一个将我的磁盘写满了。凭直觉我觉得这应该是一个boundschecker用来记录内存变化情况或者是相关信息的文件,好,那么就去该boundschecker的设置,我去掉了很多觉得无用的设置选项,再来,果然没有了,但是依然要等很长时间才能显示出来,而且帧数比较小。 再调,再调,怎么调都没有办法调得正常了,卸载重装,再卸再装,没有办法了,最后很无奈,我对boundschecker的使用以失败告终。 Trackback: http://tb.donews.net/TrackBack.aspx?PostId=94614 [点击此处收藏本文] 发表于2004年09月10日 1:08 PM wing 发表于2005-05-24 9:58 PM IP: 202.103.41.* 今天使用boundchecker,不会用,极度不爽,无奈,去google上搜一把,搜索到你这篇文章,狂喜,结果,仔细研究,到最后,竟然发现是"最后很无奈,我对boundschecker的使用以失败告终。"! 现在,极度郁闷+气愤! 哎,再加伤心!:( 不过,看你的文章,感觉遭遇有点点相似,4406250,希望能常交流!:) 发表于2005-10-29 3:56 PM IP: 202.113.34.* 哈哈 和楼上一样撒!~ 不过我还没用. 正开始要用 min2max 发表于2006-05-24 8:49 AM IP: 218.25.173.* “去google上搜一把,搜索到你这篇文章,狂喜,结果,仔细研究,到最后,竟然发现是"最后很无奈,我对boundschecker的使用以失败告终。"! 现在,极度郁闷+气愤! ” 猫小 发表于2006-07-20 10:34 AM IP: 210.76.108.* BoundsChecker 已经是很古老的叫法了,一看就是6.x的版本。 7.0版本之下的BoundsChecker在Windows Xp上不好用的,7.0之上叫做 Compuware Numega DevPartner Studio Error Detection 很长,现在我手边的版本是8.0,用起来很舒服,从没遇到你们的问题。 转转 发表于2006-08-29 9:43 PM IP: 221.237.67.*, 127.0.0.* 我用BoundsChecker怎么没有觉得它会反应好慢呢! LIJUNHUI 发表于2006-09-09 4:10 PM IP: 211.154.1.*, 127.0.0.* 我也是找使用说明,找到这里来的,结果也很无奈,呵呵 那位仁兄有相关的资料,请邮件一份了,先谢谢了! ljh_0110@163.com 飞鸟 发表于2007-08-10 10:36 AM IP: 60.208.253.* 我也步会用啊,求救。。。。 谁有中文使用文档给小弟发一个了,千恩万谢尽在不言中了。。。 飞鸟 发表于2007-08-10 10:37 AM IP: 60.208.253.* 刚才忘了说邮箱了: 俺的邮箱是:vwintech@sina.com 有了 boundsCheck 的使用文档给我发一个啊,谢谢了

原创粉丝点击