我爱Aspx >> VC.Net >> <b>浅谈内存泄漏(三)</b>记录Call Stack信息会使程序的运行变得非常慢,因此默认情况下BoundsChecker不会记录Call Stack信息。可以按照以下的步骤打开记录Call Stack信息的选项开关:
1. 打开菜单:BoundsChecker|Setting…
2. 在Error Detection页中,在Error Detection Scheme的List中选择Custom
3. 在Category的Combox中选择Pointer and leak error check
4. 钩上Report Call Stack复选框
5. 点击Ok
基于Code Injection,BoundsChecker还提供了API Parameter的校验功能,memory over run等功能。这些功能对于程序的开发都非常有益。由于这些内容不属于本文的主题,所以不在此详述了。
尽管BoundsChecker的功能如此强大,但是面对隐式内存泄漏仍然显得苍白无力。所以接下来我们看看如何用Performance Monitor检测内存泄漏。
使用Performance Monitor检测内存泄漏
NT的内核在设计过程中已经加入了系统监视功能,比如CPU的使用率,内存的使用情况,I/O操作的频繁度等都作为一个个Counter,应用程序可以通过读取这些Counter了解整个系统的或者某个进程的运行状况。Performance Monitor就是这样一个应用程序。
为了检测内存泄漏,我们一般可以监视Process对象的Handle Count,Virutal Bytes 和Working Set三个Counter。Handle Count记录了进程当前打开的HANDLE的个数,监视这个Counter有助于我们发现程序是否有Handle泄漏;Virtual Bytes记录了该进程当前在虚地址空间上使用的虚拟内存的大小,NT的内存分配采用了两步走的方法,首先,在虚地址空间上保留一段空间,这时操作系统并没有分配物理内存,只是保留了一段地址。然后,再提交这段空间,这时操作系统才会分配物理内存。所以,Virtual Bytes一般总大于程序的Working Set。监视Virutal Bytes可以帮助我们发现一些系统底层的问题; Working Set记录了操作系统为进程已提交的内存的总量,这个值和程序申请的内存总量存在密切的关系,如果程序存在内存的泄漏这个值会持续增加,但是Virtual Bytes却是跳跃式增加的。
【我对这篇文章有话说?】
<b>浅谈内存泄漏(二)<..[05-21]
<b>浅谈内存泄漏(一)</..[05-21]
<b>以原始套接字的方式 截..[05-21]
<b>MFC窗口位置管理详细分..[05-21]
<b>在Visual Studio 6.0集..[05-21]
<b>如何在windows程序中读..[05-21]
<b>根据文本串的长度改变窗..[05-21]
<b>VC控件 TreeCtrl 与 Li..[05-21]
<b>如何隐藏显示在任务栏中..[05-21]
<b>利用WinSock进行无连接..[05-21]