1.简介
BoundsChecker是一个很强大的调试工具。这里只简单介绍如何用它的FinalCheck模式定位比较难定位的错误。
FinalCheck模式简单来说就是BoundsChecker在你的代码里加一些诊断代码来检查平时比较难查出的内存越界,错误的指针使用等。
不过付出的代价就是程序跑起来会比较慢,所以在不用时最好是把FinalCheck模式关掉。特别是发布前。
2.启用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的监测下运行起来了。
3.查看错误信息
此时你的解决方案里会多出一个 DevPartner Sessions->BoundsChecker->BoundsChecker-Active Session
双击它可以看到目前出现的错误。
我们关注Errors那个页签,其他的可以自行研究。这里有很多错误。有的会有源码。
不明的这个错误说什么的可以右键点击这个错误,点击explain里面有很详细的解释。
4.性能及相关设置
FinalCheck是很耗cpu和内存资源的,所以如果机器不好,可能会非常慢。这里可以做想应设置先去掉一些检测功能来加快速度。
打开BoundsChecker的选项“工具->BoundsChecker->Options”
1. Resource Tracking里的Enable resource tracking可以先去掉,因为暂时不需要对资源的检测
2. Memory Tracking中是对不同的情况进行监测,可以先去掉一些你不关心的。或是一次只监测一部分。
5.其他问题:
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++ -> 优化 -> 内联函数展开”设成默认。
遇到其他问题对照它给出的信息做相应设置修改就行了。