使用 PHD 類別來隔離記憶體遺漏 (Memory Leak)

文章翻譯 文章翻譯
文章編號: 194655 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

結論

記憶體遺漏 (Memory Leak) 是許多應用程式中的問題。判斷記憶體遺漏 (Memory Leak) 的具體的方式是使用本文所提供之 PHD Visual C++ 類別。藉由記錄記憶體統計資料使用 PHD 類別的應用程式中,您可以要更精確的了解發生記憶體遺漏。

自動解壓縮 PHD.EXE 是範例,示範如何使用包含的 PHD 類別證明/disprove 有記憶體流失的現象發生。PHD 類別是效能協助程式函式,從 Windows NT 資源套件周圍的細包裝函式。這個程式碼只能在 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
   );
				

其他工具

您可以搜尋上可以協助您尋找記憶體遺漏 (Memory Leak) 的各種協力廠商偵錯資訊的 FAQ 網頁在 Web 上。比方說下列常見問題集提及數種產品:
http://docs.linux.cz/programming/c/www.eskimo.com/~scs/C-faq/q18.2.html
附註此處所討論的協力廠商產品製造廠商與 Microsoft 無關 ; 我們不以暗示或其他方式,提供與這些產品的效能或可靠性有關的保證。您也應該注意有時這些產品可以讓的遺漏 (Memory Leak),則為 False 報告,但是它們仍然是非常有用的工具。

而且,偵錯 API 的 Visual C++ 堆積是很有用的工具,來尋找遺漏 (Memory Leak)。這些包括函數如 _CrtMemDifference() 和 _CrtMemDumpAllObjectsSince(),偵錯函式參考 > 一節中的 Visual C++ 程式設計人員指南 》 中所記載的。這些函式只會偵測遺漏 (Memory Leak) 中程式碼並不在其他元件中的遺漏。

(c) [Microsoft Corporation 1998 年,[保留所有的權限]。由 Rick Anderson,Microsoft Corporation 的貢獻。

屬性

文章編號: 194655 - 上次校閱: 2014年2月23日 - 版次: 2.5
這篇文章中的資訊適用於:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Studio 97 Service Pack 3
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
關鍵字:?
kbnosurvey kbarchive kbmt kbdownload kbfile kbinfo kbsample KB194655 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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