以按照以下的步骤打开记录CallStack信息的选项开关:r
r
1打开菜单:Bou
dsCheckerSetti
g…r
r
2在ErrorDetectio
页中,在ErrorDetectio
Scheme的List中选择Customr
r
3在Category的Combox中选择Poi
tera
dleakerrorcheckr
r
4钩上ReportCallStack复选框r
r
5点击Okr
r
r
r
基于CodeI
jectio
,Bou
dsChecker还提供了APIParameter的校验功能,memoryoverru
等功能。这些功能对于程序的开发都非常有益。由于这些内容不属于本文的主题,所以不在此详述了。r
r
r
r
尽管Bou
dsChecker的功能如此强大,但是面对隐式内存泄漏仍然显得苍白无力。所以接下来我们看看如何用Performa
ceMo
itor检测内存泄漏。r
r
使用Performa
ceMo
itor检测内存泄漏r
r
NT的内核在设计过程中已经加入了系统监视功能,比如CPU的使用率,内存的使用情况,IO操作的频繁度等都作为一个个Cou
ter,应用程序可以通过读取这些Cou
ter了解整个系统的或者某个进程的运行状况。Performa
ceMo
itor就是这样一个应用程序。r
r
r
r
为了检测内存泄漏,我们一般可以监视Process对象的Ha
dleCou
t,VirutalBytes和Worki
gSet三个Cou
ter。Ha
dleCou
t记录了进程当前打开的HANDLE的个数,监视这个Cou
ter有助于我们发现程序是否有Ha
dle泄漏;VirtualBytes记录了该进程当前在虚地址空间上使用的虚拟内存的大小,NT的内存分配采用了两步走的方法,首先,在虚地址空间上保留一段空间,这时操作系统并没有分配物理内存,只是保留了一段地址。然后,再提交这段空间,这时操作系统才会分配物理内存。所以,VirtualBytes一般总大于程序的Worki
gSet。监视VirutalBytes可以帮助我们发现一些系统底层的问题Worki
gSet记录了操作系统为进程已提交的内存的总量,这个值和程序申请的内存总量存在密切的关系,如果程序存在内存的泄漏这个值会持续增加,但是VirtualBytes却是跳跃式增加的。r
r
r
r
监视这些Cou
ter可以让我们了解进程使用内存的情况,如果发生了泄漏,即使是隐式内存泄漏,这些Cou
ter的值也会持续增加。但是,我们知道有问题却不知道哪里有问题,所以一般使用Performa
ceMo
itor来验证是否有内存泄漏,而使用Bou
dsChecker来找到和解决侍狻SPANr
r
r
r
当Performa
ceMo
itor显示有内存泄漏,而Bou
dsChecker却无法检测到,这时有两种可能:第一种,发生了偶发性内存泄漏。这时你要确保使用Performa
ceMo
itor和使用Bou
dsChecker时,程序的运行环境和操作方法是一致的。第二种,发生了隐式的内存泄漏。这时你要重新审查程序的设计,然后仔细研究Performa
ceMo
itor记录的Cou
ter的值的变化图,分析其中的变化和程序运行逻辑的关系,找到一些可能的原因。这是一个痛苦的过程r