BoundsChecker使用
转载:http://www.cnitblog.com/qiuyangzh/archive/2005/07/14/975.html
1 前言
我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。
2安装
NuMega的安装很简单。获得NuMega安装程序后,点击setup.exe进行安装即可。在安装过程中不需要什么特殊的设置。
不过有一点需要说明,在安装NuMega之前,应该确保你的机器上已经安装好了Visual C++,因为只有这样才能使NuMega成功的集成到Visual C++开发环境中去。
好了,下面我们分三个部分,分别介绍BoundsChecker、TrueCoverage、TrueTime的使用方法。
3 BoundsChecker
BoundsChecker 是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。BoundsChecker能检测的错误包括:
BoundsChecker安装成功后,在你的VC++集成开发环境中,会多出了一个名为BoundsChecker的菜单,如下所示:
图3-1 BoundsChecker在VC++集成开发环境中添加的菜单
BoundsChecker 已经非常完好的集成到VC++集成开发环境中了。
使用BoundsChecker对程序的运行时错误进行检测,有两种使用模式可供选择。一种模式叫做ActiveCheck,一种模式叫做FinalCheck。下面分别进行介绍。
3.1 ActiveCheck
ActiveCheck是BoundsChecker提供的一种方便、快捷的错误检测模式,它能检测的错误种类有限,只包括:内存泄露错误、资源泄露错误、API函数使用错误。
3.1.1 用ActiveCheck来检测错误
首先,在VC++集成开发环境中打开你要对其进行测试的程序,同时保证项目处于Debug编译状态下。
最后,在VC++集成开发环境中选择[Build/ Start Debug/Go]菜单命令,在Debug状态下运行程序,ActiveCheck也在后台开始运行了。
这时,就可以按照制定好的测试用例,对程序进行操作。凡是程序执行过的代码,如果存在错误,ActiveCheck就会记录下来。
有一个地方要说一下,在[BoundsChecker]菜单中有一项[Report Errors Immediately],如下图所示:
图3-2 关于[BoundsChecker / Report Errors Immediately] 菜单项
该菜单项对于ActiveCheck 模式,以及下面就要介绍的FinalCheck模式的作用是一样的,即:如果不选中该项,则BoundsChecker会记录程序运行过程中发现的各种错误,直到程序结束后再进行报告;当选中该菜单项时,在程序的运行过程中,一旦BoundsChecker发现错误,会马上弹出如下的对话框进行提示:
图3-3 错误报告对话框
下面按图中标注的数字序号解释一下对话框中各个按钮的功能:
按钮1:点击该按钮,则表示先暂时不理会这个错误,继续执行程序。
按钮2:点击该按钮,则会马上跳转到出现问题的代码行处。处理完问题后,点击[Build/ Start Debug/Go]菜单项,可以继续执行程序,进行检测。
按钮3:点击该按钮,则将该错误添加到被忽略的错误列表中去,当再次出现这个问题时,BoundsChecker将不会进行报告。
按钮4:点击该按钮,则立即终止程序的执行。
按钮5:点击该按钮,会显示当前内存的申请、使用情况。
按钮6:点击该按钮,会得到当前这个错误的帮助信息。
按钮7、8: 这两个按钮与[BoundsChecker/Report Errors Immediately]和[BoundsChecker/ Report Errors and Event] 菜单命令的功能是完全一样的,在此不再赘述。
按钮9:点击该按钮,会显示/隐藏与该错误有关的函数调用堆栈情况,以及具体的出错代码行的位置。
是否选中[BoundsChecker/Report Errors Immediately]菜单项,完全取决于你自己的喜好,以及测试时的具体情况。如果你想要BoundsChecker在程序运行过程中实时向你汇报发现的错误,那么你就选中这个菜单项;如果想等到操作结束后,再对操作过程中BoundsChecker发现的错误统一进行分析,就不必选中这个菜单项。我在平常使用过程中更偏向于使用后一种。
3.1.2 分析错误
BoundsChecker 会显示一个所发现错误的列表。我们需要对列表中罗列的错误进行分析,来确定错误的原因和位置。
在错误检测结果列表中,罗列出了在程序的执行过程中ActiveCheck检测到的所有的内存泄露、资源泄露和API函数使用错误的相关信息。如下图所示:
图3-4 错误检测结果
在左边的窗口中,逐条列出了程序在内存、资源、API 函数使用上的问题,包括:该问题的种类,该问题发生的次数,如果是内存泄露,损失了多少内存,以及发生该问题的代码位置等等。当你用鼠标单击选中某一条记录时,在右边的窗口中会显示出与该条错误记录相对应的函数调用堆栈情况。当你用鼠标双击某一条错误记录时,会定位到引发该错误的源代码处。
好了,BoundsChecker在ActiveCheck模式下的使用方法至此介绍完了,是不是很简单?
在ActiveCheck模式下检测程序时,程序的运行速度基本不受影响,但其缺点是检测的错误种类有限,即只能检查出内存泄露错误、资源泄露错误、API函数使用错误。BoundsChecker 提供了另外一种检测错误的模式—— FinalCheck,也就是我们在前面提到的BoundsChecker的第二种使用模式。 FinalCheck可以检测出程序中更多的错误。下面我们就对它进行介绍。
3.2 用 FinalCheck检测更多的错误
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。所以,何时使用何种模式,应根据当时的具体情况而定。
3.3 检测Win32 API函数的兼容性
启动[BoundsChecker/View/Compliance Report]菜单命令,如下图所示:
图3-5 启动Win32 API函数兼容性检测功能
会弹出下面的窗口:
图3-6Win32 API函数兼容性检测功能
在对话框中选择程序承诺能够运行的平台,以及被要求遵从的其他标准(标准C和扩展的标准C),点击“OK”按钮,BoundChecker会给出兼容性检测报告。
3.4 忽略错误
在某些情况下,我们需要忽略BoundsChecker报告的一些错误,这些情况包括:
3.5 其他
4 TrueCoverage
对于这些问题,如果没有覆盖率统计工具的帮助,而想通过手工来进行,几乎是不可能的。
TrueCoverage的应用阶段为单元测试阶段和集成测试阶段。
和BoundChecker一样,TrueCoverage安装成功后,在你的VC++集成开发环境中,会多出一个名为TrueCoverage的菜单,如下图所示:
图4-1 TrueCoverage在VC++集成开发环境中添加的菜单
这说明,TrueCoverage已经完好的集成到VC++集成开发环境中了。
下面开始介绍TrueCoverage的具体使用步骤。
4.1 使用TrueCoverage
首先,点击[ Build/Configurations...]菜单命令。
然后,在Configuration 编辑框中添入你为TrueCoverage创建的文件夹的名称,这个名称是任意的,比如我们叫做TrueCoverage。
最后,在 Copy settings from组合框中选中 XXX—Win32 Debug项,然后点击OK按钮,接着点击Close按钮。
现在,我们已经为TrueCoverage构造好了一个文件夹。
3 点击[Build/Set Active Configuration…] 菜单命令,选中你刚才为TrueCoverage建的文件夹,然后点击OK按钮。
在TrueCoverage界面中有一个工具条,我们有必要在这里对它做一下说明。如下所示:
这个工具条在程序运行起来后,会由不可用状态变为可用状态。工具条上各按钮功能为:
按钮1:如果在程序的运行过程中你按下了该按钮,则覆盖率的统计只计算到此,你还可以继续操作程序,但此时对程序的任何操作都不再计入到覆盖率统计中去了。
按钮2:如果在程序的运行过程中你按下了该按钮,则TrueCoverage会马上显示截止到目前为止的测试覆盖率情况。之后你可以继续操作程序,TrueCoverage会继续在后台记录程序的执行覆盖情况。
下面介绍一下TrueCoverage的界面,按图中的编号分别给出说明。
1:表示程序在某一次执行结束后的测试覆盖情况。双击某一个条目,会在3、4部分的窗口中显示关于本次覆盖率的详细信息。本图中的情况,表示测试人员执行了两次程序。
2:表示程序当前总的测试覆盖情况,是多个1合并后的结果。双击该条目,会在3、4部分的窗口中显示关于总覆盖率的详细信息。
3:该窗口中显示的数据与你当前选中的某一次或总的测试覆盖统计结果相对应(即前面说到的1、2)。该窗口中显示的数据包括:程序的覆盖率、每个代码文件的覆盖率。更详细的信息显示在窗口4中。
图4-4 TrueCoverage用不同颜色标识执行过的和未被执行过的代码
4.2 对内联函数的处理
内联函数虽然具有函数的形式,但其机制与函数完全不同,所以,在用TrueCoverage统计测试覆盖率时,对内联函数需要采用不同的处理方式。
选中“Instrument inline function”复选框,点击OK。
4.3 TrueCoverage与BoundsChecker的结合使用
4.4 其他
与BoundsChecker一样,要使用TrueCoverage,一定要有被测程序的源代码。如果没有源码,TrueCoverage无法统计覆盖率。
5 TrueTime
TrueTime安装成功后,在你的VC++集成开发环境中,会多出一个名为TrueTime的菜单,如下图所示:
图5-1 TrueTime在VC++集成开发环境中添加的菜单
这说明,TrueTime已经完好的集成到VC++集成开发环境中了。
下面开始介绍TrueTime的具体使用步骤。
5.1 使用TrueTime
首先,点击[ Build/Configurations...]菜单命令。
然后,在Configuration 编辑框中添入你为TrueTime创建的构造文件夹的名称,这个名称是任意的。比如我们取名为TrueTime。
最后,在 Copy settings from组合框中选中 XXX—Win32 Debug项,然后点击OK按钮,接着点击Close按钮。
3 点击[Build/Set Active Configuration…] 菜单命令,选中你刚才为TrueTime创建的文件夹, 然后点击OK按钮。
5点击[TrueTime/Run with TrueTime] 菜单命令,TrueTime被启动,接着你的程序也被启动并执行起来。
这时,按照事先制定好的测试用例,执行测试用例。TrueTime会记录下被执行到的程序代码的性能数据。
图5-2 运行控制工具条
这个工具条在程序运行起来后,会由不可用状态变为可用状态。工具条上各按钮功能为:
按钮1:如果在程序的运行过程中你按下了该按钮,则性能统计只计算到此,虽然还可以继续操作程序,但此时对程序的任何操作都不再计入到性能统计中去了。
按钮2:如果在程序的运行过程中你按下了该按钮,则TrueTime会马上显示截止到目前为止的性能统计情况。之后你可以继续操作程序,TrueTime会继续在后台记录程序的性能数据。
按钮3:如果在程序的运行过程中你按下了该按钮,则TrueTime会清除在这之前所记录的性能数据,使各项性能数据为零。你可以继续操作,TrueTime在后台从零开始重新记录程序的性能数据。
6当你退出程序时,TrueTime会显示本次操作过程中被执行到的模块、函数、代码行的执行性能数据。要想对程序开始一次新的性能统计,点击TrueTime 中的[Program / Start]菜单命令即可。
TrueTime检测结果的界面如下:
图5-3 TrueTime的运行界面
区域1:
列出了多次运行应用程序后,得到的多个性能检测结果。双击某一项,会在区域2、区域3中显示应用程序在这一次运行过程中的详细性能数据。
区域2:
该窗口中显示的数据与你在区域1中选中的某一次性能检测相对应。窗口中显示的数据以模块(exe、dll等)为单位,列出了程序在某一次执行过程中,各模块的性能数据。对于各模块更为详细的性能数据,显示在区域3中。
区域3:
该窗口中显示的数据与你在区域2中的选择相对应,显示了模块中各个函数的性能数据。在区域3中有三个标签页——Function List标签页、Source标签页、Session Summary标签页。每个标签页中都列出了一组性能数据。其实要使用TrueTime,也就是要了解这些性能数据的含义。下面按照标签页对各项性能数据的含义进行解释:
Function List标签页
在Function List标签页中,用鼠标左键双击某一个函数,会弹出一个对话框,如下图所示:
图5-4 性能数据查看对话框
通过该对话框,能够查看该函数的父函数(调用该函数的函数)、子函数(被该函数调用的函数)的性能信息。
Function List标签页列出了选定模块所包含的函数的性能数据,这些数据包括:
Function Name——函数名称。
% in Function——这是一个百分比,分子为该函数执行的时间,分母为系统从开始运行到结束的时间。
% with Children —— 这是一个百分比,分子为该函数执行的时间,其中包括在该函数中又调用的子函数的运行时间,分母为系统从开始运行到结束的时间。
Called——函数在本次的执行过程中被调用的次数。
Image——函数所在的模块名称(模块指EXE、DLL、OCX等)。
% in Image——这是一个百分比,分子为该函数执行的时间,分母为该函数所在的模块(EXE、DLL、OCX)运行的时间。
Average——函数多次运行时的平均执行时间,其中不包括该函数调用的子函数的运行时间。
First——函数第一次执行所耗费的时间。
Minimum——函数的多次执行中,耗费时间最短的那一次所用的时间。
Maximum——函数的多次执行中,耗费时间最长的那一次所用的时间。
Average with Children——函数被多次执行时,平均执行时间,其中包括该函数调用的子函数运行的时间。
Real——函数的平均执行时间,包括该函数调用的子函数所运行的时间,除此之外,还包括了花费在系统中同时运行着的其他应用程序的线程所耗费的时间。
Address——函数的入口地址。
Source标签页
Source标签页列出了选定模块的指定源文件所包含的各行程序代码的性能数据,这些数据包括:
Count——该行代码在测试过程中被执行的次数。
% of Function——这是一个百分比,分子为该行代码执行的时间,分母为该函数执行的时间。
% With Children——这也是一个百分比,分子为该行代码执行的时间,分母为系统从开始运行到结束的时间。
Time——在系统的运行过程中,该行代码运行时间的累计和。
Functions——该行代码调用的函数的数量。
Line#——代码所在行的行号。
Source——源代码。
Session Summary标签页
Session Summarye标签页列出了该次性能统计的概要信息,内容很好理解,在此就不详细介绍了。
TrueTime为性能数据提供了四种不同的单位,分别是:CPU时钟周期、微妙、毫秒、秒。我们可通过TrueTime中的[View/Scale]菜单项进行设置,如下:
图5-5 性能数据单位设置菜单
在菜单中选中哪一项,性能数据就会以该时间单位显示。
5.2 其他
TrueTime可以收集没有源码部分(比如第三方的DLL、OCX等)的运行性能数据,但如果我们想获得某一个模块的详细运行性能数据,还是需要该模块的源代码。
6 结束
BoundsChecker使用相关推荐
- Visual studio内存泄露检查工具--BoundsChecker
BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...
- 使用BoundsChecker查找内存泄露
以前搞开发时,曾经写过类似的文章,不过带不出来,最近VS推出了新版VS2010,而BoundsChecker也推出了适用于vc6, vs2005,vs2008,vs2010的新版本,于是下载下来试了一 ...
- 学习BoundsChecker
对C++程序不熟悉,但是因为工作需要,要对一些程序进行测试分析,找出是否有内存泄露情况.在网上找到了大家比较推崇的BoundsChecker,安装后开始看软件自带的手册,为了让更多的同事一起学习,要将 ...
- 我是怎样使用BoundsChecker的
在开始本文之前,我想声明的是我曾经在NuMega工作过,并在那里参与编写了BoundsChecker的3.4.5版本.显然,我个人非常推崇BoundsChecker,尽管还会有一些其它能与Bounds ...
- BoundsChecker的用法
BoundsChecker 是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误.BoundsChecker能检测的错误包括: 1))1.指针操作和内存.资源泄露错误,比如: 内 ...
- BoundsChecker简易使用教程
BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...
- VS2005 下使用BoundsChecker检测内存泄露
BoundsChecker无法集成到VS2005中,使用时:先用VS2005 debug模式下生成EXE,然后再用BoundsChecker打开这个EXE文件即可. 在使用过程中发现: 对于同一内存泄 ...
- 内存检测工具BoundsChecker使用详述
内存检测工具BoundsChecker使用详述 或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,BoundsChecker也是这家公司的产品.与Visual C++配合使 ...
- BoundsChecker检查内存泄露
网上有几篇文章是写BoundsChecker的,主要是讲用途在哪,对于我这初学的,连基本使用步骤还不会,运用到实际项目中就更加困难,而且DevPartner这个软件网上有几个版本,有些个下载安装好,根 ...
- 单元测试工具 BoundsChecker 【转载】
单元测试工具 BoundsChecker [转载] BoundsChecker 是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误.BoundsChecker能检测的错误包括: ...
最新文章
- OSI第七层:应用层功能及介绍
- 统计特定文件中的词频
- Android非UI线程更新UI的几种方法
- 最新综述 | 强化学习中从仿真器到现实环境的迁移
- AE 模板 天使之城
- python交叉编译的配置 脚本怎么写_如何写一个简单的脚本并配置
- 前端跳转页面 添加request headers_前端需要了解的 CORS 知识
- 唯一被图灵求婚的女人,与他并肩破译纳粹德国 Enigma 密码,拯救千万人生命!| 人物志...
- AcWing 1884. COW(前缀和)
- VC开发数据库基础之ADO篇
- 《别闹了,费曼先生》
- 高数-极限-求极限值--两个重要极限(以及拓展公式)
- matlab质心原理图,matlab:绘制质心
- 签证者的武林秘笈(一)—-来自太傻的签证哲学
- PPT和WORD转成PDF时图有黑底
- 异常-银行账户异常处理
- 在CentOS 7.6(1810)下自定义自己的登录欢迎信息(修改motd文件)
- 所有网站都通用的自定义弹出框alert
- java vips 算法_VIPS:基于视觉的Web页面分页算法[转]
- 南京大学赵鹏:动态环境在线学习的算法与理论研究
热门文章
- java字节码查看器_jclasslib 下载
- 【CSS】纯CSS实现三级导航(模板)
- Instant Run(App加壳)
- linux怎样判断vim是否安装上,Linux系统中vim的安装
- 通过ArcGIS创建一个地理数据库至SQLServer数据库中
- python小学教材全解_小学教材全解三年级下数学
- ArcMap|时空地理加权回归(GTWR)
- h5 如何录音保存上传_html5 网页录音、试听以及上传
- react 使用iconfont 图标
- 如何在CAD中实现影像与矢量叠加套合(四参数法)