主题: [技术]使用BoundsChecker的FinalCheck模式定位比较难定位的错误

简介
  (FinalCheck能检测出的错误列表见

附录1


  BoundsChecker是一个很强大的调试工具。这里只简单介绍如何用它的FinalCheck模式定位比较难定位的错误。
FinalCheck模式简单来说就是BoundsChecker在你的代码里加一些诊断代码来检查平时比较难查出的内存越界,错误的指针使用等。
不过付出的代价就是程序跑起来会比较慢,所以在不用时最好是把FinalCheck模式关掉。特别是发布前。

BoundsChecker下载地址

电驴资源
下面是用户共享的文件列表,安装电驴后,您可以点击这些文件名进行下载
BoundsChecker.v7.2.rar 详情 59.7MB
<script type="text/javascript"></script> 59.7MB

启用FinalCheck模式(基于Visual Studio 2003)
  1. 在VC的菜单里的“工具->BoundsChecker”
    a. 选中“Error Detection” (选中此项让你在调试运行时让BoundsChecker同时检测程序的错误,不选中就是普通的调试程序)
    b. 选中“Log Event”
    c. 去掉“Display error and pause”(出现错误时是否立即提示,可以试试选中它看看是什么效果)
    d. 选中FinalCheck(编译时加入BoundsChecker的诊断代码,不再需要此功能时,要把这个选项去掉再把工程重新编译一遍)
  2. 在VC的菜单里打开“工具->BoundsChecker->Options”确认里面的“Memory Tracking->Enable FinalCheck”被选中。
  3. 重新编译你的工程,这时BoundsChecker会在编译的过程中插入些诊断代码用于之后的监测。(如果编译不通过,参看 附录2
  4. 按F5调试运行你的程序
  -这时你的程序就在BoundsChecker的监测下运行起来了。

查看错误信息
  此时你的解决方案里会多出一个 DevPartner Sessions->BoundsChecker->BoundsChecker-Active Session
  双击它可以看到目前出现的错误。
  我们关注Errors那个页签,其他的可以自行研究。这里有很多错误。有的会有源码。
  不明的这个错误说什么的可以右键点击这个错误,点击explain里面有很详细的解释。

性能及相关设置
  FinalCheck是很耗cpu和内存资源的,所以如果机器不好,可能会非常慢。这里可以做想应设置先去掉一些检测功能来加快速度。
  打开BoundsChecker的选项“工具->BoundsChecker->Options”
  1. Resource Tracking里的Enable resource tracking可以先去掉,因为暂时不需要对资源的检测
  2. Memory Tracking中是对不同的情况进行监测,可以先去掉一些你不关心的。或是一次只监测一部分。

其他问题:
  1. 如果你的解决方案里含有多个项目,那要注意FinalCheck是对于项目的,要注意哪个是当前项目。
  2. 遇到其他问题可以查看BoundsChecker的帮助,或在网上搜索。帮助在安装目录下的help里的bc7.chm
  3. 如果不使用集成到VC里的BoundsChecker,也可以使用安装目录下的BC7.exe去打开你的程序exe运行。
   但编译还是要按上面所说的编译。另注意BC7.exe的"setting->Memory Tracking->Enable FinalCheck"要被选上。
  4. 如果过程中你遇到问题欢迎跟贴。

附录1: BoundsChecker的FinalCheck模式能检测出的错误列表

 Pointer Errors - 指针错误
  Array index out of range - 使用越界的数组索引
  Assigning pointer out of range - 使用越界的指针
  Expression uses dangling pointer - 使用野指针
  Expression uses unrelated pointer - 不相关指针相互比较
  Function pointer is not a function - 函数指针指向的不是函数地址

 Memory Errors - 内存错误
  Reading overflows memory - 越界读内存
  Reading uninitialized memory - 读未初始化的内存
  Writing overflows memory - 越界写内存

 Leak Errors - 泄漏
  Memory leaked due to free - 未释放内嵌指针导致的内存泄漏
  Memory leaked due to reassignment - 指针重赋值导致的内存泄漏
  Memory leaked leaving scope - 离开作用域导致的内存泄漏
  Returning pointer to local variable - 返回局部变量的指针

附录2:与FinalCheck冲突的编译参数

 在使用FinalCheck重新编译工程的过程中可能会出现一些编译错误,因为FinalCheck跟一些编译选项有冲突,
 目前所知的有:
 a. 关掉“常规->全程序优化”
 b. “C/C++ -> 优化 -> 内联函数展开”设成默认。
 遇到其他问题对照它给出的信息做相应设置修改就行了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值