使用 PHD 类隔离内存泄漏

文章翻译 文章翻译
文章编号: 194655 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

概要

内存泄漏是许多应用程序中的问题。确定内存泄漏的一个具体方法是使用本文中提供的 PHD Visual c + + 类。通过登录应用程序使用 PHD 类内存统计信息,您可以获得一个更精确地了解出现内存泄漏的位置。

自解压 PHD.EXE 是一个示例,该示例演示如何使用包含的 PHD 的类来证明/disprove 内存泄漏。PHD 类是从 Windows NT 资源工具包的性能 Helper 函数精简的包装。此代码仅在 Windows NT 上工作。

更多信息

可从 Microsoft 下载中心下载以下文件:
Phd.exe
发布日期: 十月-23 1998 年

有关如何下载 Microsoft 支持文件的其他信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591如何从联机服务获得 Microsoft 支持文件
Microsoft 扫描此文件的病毒。Microsoft 使用该文件已过帐的日期上获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器,这有助于防止未经授权的情况下对其进行更改文件上。
以下的密钥文件包含在该示例中:
    FileName                Description
    ---------------------------------------------------------
   PDH.dll                  Contains helper functions used by PHD.
   RKLeak.cpp               Contains the code for the PHD class.
   RKLeak.h                 Header file for the PHD class.
   TestMain.cpp             A simple program to demonstrate the PHD class.
				

若要用于 PHD 类包含在项目中的 RKLeak.cpp 文件。因头文件中,您将导致到附带了 Visual c + + 6.0 在 PDH.lib 库的链接。您还需要将 PHD.dll 文件添加到您的路径,以便使应用程序将发现它。

TestMain.cpp 文件包含下面的代码示例演示如何使用 PHD 类:

示例代码

   **************************************************
   #include "rkLeak.h"

   void main()
   {

      char *myCntrs[]={
         "\\Memory\\Available bytes",
         "\\Memory\\committed bytes",
         "\\Memory\\pool Paged bytes",
         "\\Memory\\pool Nonpaged bytes",
      };

      PHD mphd2(myCntrs,sizeof(myCntrs)/sizeof(myCntrs[0]));
      PHD mphd;

      const int arSize=4096;
      for (int i=0;i<5;i++){
         double *d = new double[arSize];
         d[0]= 1.;      d[arSize-1] = 2.;  // Force to committed mem.
         mphd.logData(i);
         mphd2.logData(i);
      }

   ***************************************************
				

第一次使用 PHD 构造函数允许您指定您想要监视的项目。这些是相同的项目 Perfmon.exe 应用程序中可用的。

第二个使用 PHD 构造函数 (无参数的) 使用以下默认列日志: 专用字节、 页文件字节数、 页面缓冲池字节池未分页的字节和工作集。

正如您所看到的代码示例从,PHD 类用于将可疑泄漏 API 放在一个循环,并定期调用 PHD::logData 方法。数据记录到具有名称的文件"< 您 EXE name>_perf.log"在当前目录中。如果结果日志文件专用以字节为单位) 显示线性增加,这种增长不表示内存泄漏在 API 中,但只是一个应用程序中的内存泄漏。如果 API 使用不正确 (例如对于通过没有正确地释放资源分配的初始调用),结果将显示仅内存泄漏,不出现故障的 API。若要缩小问题,创建执行 API 的最简单可能应用程序有问题。

visual c + + 5.x 用户需要注释从 RKLeak.h 以下行:
   #undef PdhOpenQuery      //          PdhOpenQueryA
   extern "C" long __stdcall
   PdhOpenQuery (
       IN      LPCSTR      szDataSource,
       IN      DWORD       dwUserData,
       IN      HQUERY      *phQuery
   );
				

其他工具

您可以搜索在常见问题解答页中有关可以帮助您查找内存泄漏的各种第三方调试器的信息在网站上。例如对于以下的 FAQ 提到了几种产品:
http://docs.linux.cz/programming/c/www.eskimo.com/~scs/C-faq/q18.2.html
注意这里讨论的第三方产品由独立的 Microsoft 的供应商生产的 ; 我们不保证,或暗示或其他方式,这些产品的性能或可靠性。还应注意有时这些产品可以使错误报告的泄漏,但它们仍是非常有用的工具。

此外,调试 API 的 Visual c + + 堆是一种有用的工具,用于查找泄漏。这些包括如 _CrtMemDifference() 和 _CrtMemDumpAllObjectsSince(),它记录在调试函数参考部分中的 Visual c + + 程序员指南 》 中的函数。这些函数只检测在您的代码和其他组件中的不泄漏的泄漏。

(c) Microsoft Corporation 1998,保留的所有权限。Rick Anderson,Microsoft 公司的贡献。

属性

文章编号: 194655 - 最后修改: 2014年2月22日 - 修订: 2.5
这篇文章中的信息适用于:
  • Microsoft Visual Studio 6.0 企业版
  • Microsoft Visual Studio 97 Service Pack 3
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual Basic 5.0 企业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
关键字:?
kbnosurvey kbarchive kbmt kbdownload kbfile kbinfo kbsample KB194655 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 194655
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com