天天看點

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

如果您認為您遇到記憶體洩漏, 應注意, 記憶體洩漏可能不它們似乎什麼。 您可能發現記憶體洩漏是不滿足記憶體洩漏, 但是性能增強。 例如, MicrosoftJet 資料庫引擎會消耗大量記憶體因為它檢索資料并寫入緩存 256 - MB 計算機上 (最多 128 MB)。 緩存允許 Jet 引擎以獲得快速讀和寫提前緩沖。

要确定是否是一個程序遇到記憶體洩漏, 使用 Windows 性能螢幕 (Perfmon.exe) 并為應用程式程序類别下監視專用位元組。 專用位元組是總記憶體, 程序已配置設定, 但不是與其他程序共享。 注意這是不同于 VirtualBytes, 即有趣來監視。 虛拟位元組是以位元組表示的虛拟位址空間, 程序使用目前大小。 應用程式可洩漏虛拟記憶體, 但可能沒有看到配置設定專用位元組中差别。 如果看不到當監視專用位元組, 但懷疑仍然運作用盡了記憶體, 增加記憶體監視虛拟位元組以檢視備份虛拟記憶體是否正在使用。 有關檢測記憶體洩漏, 附加資訊請參閱以下 Microsoft Developer Network (MSDN) Web 站點上 " 查找 Leaks 和瓶頸與 WindowsNT PerfMon COM 對象 " 文章:

要確定應用程式, 是洩漏記憶體, 可疑代碼放在循環與許多疊代, 并然後監視對任何提高的記憶體和虛拟專用位元組。 觀看以確定不的專用位元組和虛拟位元組數不最終保持相同, 并且停止數增加。 如果沒有記憶體增加, 停止時間點看不到記憶體洩漏但更可能, 到緩存, 增長至其最大尺寸 (例如, 它并不繼續到 climb 無限)。

如果您決定使用 UMDH 之前,, 您看到記憶體洩漏, 請按照下列步驟:

1.

安裝 UMDH 實用程式。

2.

設定要安裝 UMDH 檔案夾 PATH 系統環境變量。

3.

将 _ NT _ SYMBOL _ PATH 環境變量設定為 Microsoft 符号伺服器路徑以便 UMDH 可以找到調試符号檔案。

UMDH 工具是随 DebuggingToolsforWindows 産品下面的 Microsoft Web 站點:

下載下傳和安裝實用程式, 并将 PATH 系統環境變量到路徑其中已安裝調試工具。 

使用 UMDH 之前, 必須安裝用于組成應用程式和作業系統正确調試符号。 用于 MicrosoftSymbolServer 擷取調試符号對于 Microsoft 元件。 有關 MicrosoftSymbolServer, 請單擊文章編号以檢視 Microsoft 知識庫中相應:

UMDH 嘗試通過使用 _ NT _ SYMBOL _ PATH 環境變量查找符号檔案。 指令以從指令提示符設定路徑可能與以下類似:

設定 _ NT _ SYMBOL _ PATH = SRV c:\LocalSymbolCache *

其他有關設定符号調試資訊, 請參閱本文中後面 " 調試符号 " 部分。

在完成這些步驟, 您就可以使用 UMDH 實用程式。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

<a href="http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B268343#top">回到頂端</a>

UMDH 是實用工具, 轉儲堆配置設定的程序資訊。 此資訊包括調用堆棧用于每個配置設定、 次數, 通過調用該堆棧, 進行配置設定和的消耗, 通過調用該堆棧位元組數。 例如:<code></code>

<code></code>UMDH 輸出顯示, 沒有 21280 (0x5320) 從調用堆棧配置設定位元組總數。 從 20 21280 位元組被配置設定單獨配置設定的 1064 位元組 (0x428) (0 x 14)。 辨別符是 BackTrace00053 提供調用堆棧。 

要生成轉儲檔案的堆配置設定, 您必須使用 Gflags.exe 實用程式, 也是随 DebuggingToolsforWindows 産品, 來讓作業系統知道您想要跟蹤配置設定核心。 

假設您要為 Notepad.exe 轉儲 heap(s) 内容。 必須首先啟用堆棧跟蹤擷取用于對要測試該應用程式。 預設情況下, 不啟用此功能。 要啟用此功能指令是如下:

gflags notepad.exe + ust - i

指令不啟用堆棧跟蹤為程序到已經運作, 但使堆棧跟蹤對于所有将來執行是 Notepad.exe。 通過 GFLAGS 使用者界面 (不帶任何參數以獲得使用者界面運作 Gflags.exe) 或者, 您可設定标志。 使用 <b>- ust </b>選項對于 gflags 以禁用堆棧跟蹤時, 調試已完成。 

當您通過 Gflags.exe, 圖像标志設并且設定調試符号, 您就可以啟動記事本, 使用 UMDH (應用)。 啟動程式後, 必須确定程序 ID (PID) 的隻啟動記事本程序。 對于此指令是如下:

tlist

您可以找到從輸出 TLIST 應用程式的 PID。 PID 資訊也可獲得從任務管理器。 假定對于記事本過程, 您隻啟動 PID 是 124。 可使用 UMDH 來擷取堆轉儲使用以下指令:

umdh - p 124 個 - f:notepad124.log:

<b>結果 </b>: Notepad124.log 檔案中有完整堆的 Notepad 程序轉儲。 此檔案顯示所有所做的配置設定和 callstacks 其中進行配置設定。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

如果不關心查找記憶體洩漏, UMDH 日志檔案包含對程序, 堆的目前狀态寶貴資訊時可能會更重要來比較的兩個日志輸出和了解哪些調用堆棧已看到大增長兩轉儲檔案之間。 Umdh.exe 實用程式幫助比較兩 UMDH 日志以提供分析之間差。 一旦有兩個日志捕獲不同間隔, 可再使用以下指令:

UMDH dh1.log dh2.log &gt; cmp12.txt

- 或 -

UMDH -d dh1.log dh2.log &gt; cmp12.txt

<b>- d </b>指令行選項通知 UMDH 以在十進制代替十六進制顯示。 指令的輸出比較差異的配置設定之間兩個日志并提供是類似于以下資訊:

+ 5320 (f110 - 9df0) = = 5320 3a allocs BackTrace00053 總數增加

對于每 BackTrace, UMDH 日志檔案中沒有兩個日志檔案之間進行比較。 本例說明最後一個日志檔案 UMDH 指令行中指定有 0xF110 對于相同 BackTrace 調用 (堆棧) 配置設定位元組配置設定 UMDH 指令行中第一個日志具有 0x9DF0 時位元組 UMDH 指令行中第一個日志具有 0x9DF0 時配置設定位元組對于同一 BackTrace (調用堆棧) 配置設定位元組。 " 5320 " 是配置設定的位元組數中差别。 此例, 沒有 0x5320 多位元組時間之間配置設定兩日志被捕獲。 位元組來自調用堆棧, 由 " BackTrace00053 "。 

下一步是要了解什麼是該 backtrace 中。 如果打開二日志檔案和搜尋 <b>BackTrace00053 </b>, 可能發現内容, 類似于以下内容:<code></code>

<code></code>當您檢視調用堆棧, 您可以看到, <b>LeakyFunc </b>函數配置設定記憶體通過 VisualC++ 運作時庫運算符新函數。 如果發現, 配置設定的數增大如采取多轉儲檔案, 您可能斷定不被釋放記憶體。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

UMDH 日志中最重要資訊是堆棧跟蹤的堆配置設定。 您可以分析地驗證如果程序堆記憶體洩漏。 預設情況下, 這些堆棧跟蹤不擷取。 您可啟用此功能每個程序或系統級。 使用以下指令以啟用堆棧跟蹤系統級:

gflags -r + ust

此指令後重新啟動計算機。 有關每個程序啟用, 指令是如下:

gflags APPNAME + ust - i

其中 APPNAME 是包括擴充名 (例如, Services.exe, Lsass.exe) 可執行的檔案名。 指令不啟用堆棧跟蹤為程序已運作。 是以, 對于程序, 無法重新 (用于示例、 服務、 lsass、 winlogon), 您必須重新啟動測試計算機。 

使用以下指令以驗證哪些設定已設定系統級或特定程序: 系統範圍:: 系統範圍:

gflags - r

特定程序:

gflags APP - 名稱 - i

預設情況下, 大堆棧跟蹤深度是 16。 如果要檢視深 callstacks, 可以通過運作 GFLAGS 增加此。 單擊以選中 <b>系統系統資料庫 </b>, 然後鍵入新深度 <b>Max. 堆棧跟蹤捕獲深度 </b>編輯控件中。 單擊 <b>應用 </b>, 并重新啟動計算機。 

<b>要點 </b>: 如果正在使用 Windows NT 4.0 Service Pack 6, 您必須使用 Umdh_nt4.exe, 代替 Umdh.exe, 并且您必須使用 gflags - r 指令來設定系統級堆棧跟蹤。 請確定您重新啟動計算機。 WindowsNT 版本 4 上每流程基礎上無效 Umdh_nt4 堆棧跟蹤。 它必須為整個系統設定。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

最重要步驟以使用 UMDH 之一是以確定您具有好符号檔案 (.dbg 或 .pdb 檔案) 以獲得良好堆棧跟蹤。 至少, 您需要 Kernel32.dbg 和 Ntdll.dbg 符号檔案。 您可以獲得其他調試符号, 您可能需要與您了解多關于哪些元件洩漏記憶體。 有關如何擷取 Microsoft 元件, 調試符号檔案請單擊文章編号以檢視 Microsoft 知識庫中相應:

有關如何使用 MicrosoftSymbolServer 以及如何擷取 Windows 符号程式包, 請通路 Microsoft Web 站點:

當您生成元件與 VisualC++, 值得您沒有将程式資料庫用于編輯和繼續選擇用于 C++ 編譯器選項。 相反, 選擇程式資料庫。 将符号路徑, 初始化到路徑用于 _ NT _ SYMBOL _ PATH 環境變量。 您可以使用 Microsoft 符号伺服器來擷取用于 Microsoft 元件符号。

請按照下列步驟來設定 _ NT _ SYMBOL _ PATH 環境變量:

在控制台, 輕按兩下 <b>系統 </b>。

單擊 <b>進階 </b>頁籤, 然後再單擊 <b>環境變量。</b>

也可以在指令視窗運作 UMDH 之前設定 _ NT _ SYMBOL _ PATH 環境變量。 

<b>注意 </b>: 也包括到 PDB 對元件的應用程式路徑。 例如, _ NT _ SYMBOL _ PATH 路徑設定為以下:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\myapplicationssymbols

第第一部分對此路徑指向 MicrosoftSymbolServer 并指出 c:\symbols 檔案夾中, 将下載下傳符号使用。 分号後面部分是到 PDB 檔案 (符号檔案) 專門為洩漏應用程式路徑。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

隻需要指令行參數對于 UMDH 是 <b>- p </b>選項, 指定将從中擷取堆轉儲程序的 PID。 通過使用任務管理器或 Tlist.exe 程式獲得 PID。 轉日志為類似于以下, 指令将被儲到标準輸出:

umdh - p PID:

向标準錯誤, UMDH 還顯示各種資訊性消息并是以如果您不執行重定向其, 與實際日志混合它。 以收集 UMDH 資訊性消息檔案, 中使用以下指令:

umdh - p PID 2&gt;umdh.msg:

如果要收集日志是由檔案, 中 UMDH 轉儲, 使用下列指令之一:

umdh - p PID: umdh.log

umdh f:umdh.log PID - - p:

這些指令是等效。 

通過 UMDH 獲得預設日志包含枚舉是堆消費者, 按配置設定計數排序。 如果還需要所有與其相應堆棧跟蹤, 配置設定塊的轉儲檔案用于調試目的, <b>- d </b>選項用于:

umdh - p PID - d:

如果使用此指令, 您可能看到以下 UMDH 日志檔案中:

對于跟蹤 BackTrace00046 配置設定 005F69A0 005F6150:

這些是用于調用該堆棧配置設定的記憶體位址。 如果将調試器附加到程序, 您可轉儲記憶體要檢視哪些已配置設定這些位址上的内容。 

如果日志包含太多資訊, 就可以僅限于那些具有配置設定大使用者計數超過特定門檻值。 使用以下指令:

umdh - p PID - t: THRESHOLD:

所有指令行選項 (例如, - p、 - f, - t、 - d) 同時指定按任何順序。 下面是更難指令行示例:

umdh - p 123: 1000 - f:umdh.log - d - t:

此指令将轉儲堆對于過程與 PID 123 到 Umdh.log 檔案。 它轉儲隻堆棧跟蹤, 帳戶超過 1000 配置設定和它的堆塊通過每個堆棧跟蹤配置設定位址還轉儲。 

另一個有用 UMDH 選項是 <b>- l </b>選項。 這導緻要盡可能調用堆棧中列印檔案和行号。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

如果您重定向到檔案日志 (PID -: <b>umdh,) 内容是類似于以下, 從運作 Notepad 程序已獲得它 - p: f:umdh.log</b><code></code>

<code></code>日志包含的程序中每個堆轉儲。 在本示例, 日志開頭 270000 位址處堆。 對于堆, 幾全局計數器後日志包含按減少排序順序的大多數配置設定負責堆棧跟蹤轉儲。 比較不同時間, 上所使用的記憶體動态時, 可推斷程序中發生什麼, 如果任何堆使用它類似于洩漏。

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

因為未啟用堆棧跟蹤發生常見錯誤使用 UMDH 時。 也, 用于 Ntdll.dll 正确符号使 UMDH 無法運作。 對于其他符号檔案, UMDH 運作但日志檔案包含堆棧跟蹤沒有函數名稱, 但而具有内部子產品相對位址。 遠端三錯誤指定錯誤 PID。 當您嘗試為沒有啟用堆棧跟蹤過程運作 UMDH 産生以下錯誤資訊:

C:\&gt;umdh = MyMachine - PID 1140 UMDH = 1140 連接配接正在完成子產品枚舉 logtime 06 28 2000 - - - p:: 12:43 - 計算機。 SymGetSymFromName(process, ntdll!RtlpStackTraceDataBase, xxx) 失敗, LastError = 126 ntdll UmdhGetAddrFromName 未能找到堆棧跟蹤 DB 指針) RtlpStackTraceDataBase ! (。 ntdll.dll 符号不正确 ; 我們必須能夠看到非導入符号。

使用以下指令來複查過程, 您正在調查設定:

gflags APPNAME - i

您依賴于系統級堆棧跟蹤時使用以下指令:

這些指令顯示 flags 設定為應用程式的清單。 注意如果是系統級堆棧跟蹤, 功能可能顯示為活動但實際上不激活如果您找不重新啟動計算機運作 <b>gflags -r + ust </b>指令, 後。 如果要了解具有啟用, 堆棧跟蹤每個應用程式可檢視以下系統資料庫項下 USTEnabled 項:

HKEY NT\CurrentVersion\Image 檔案執行選項

如果 UMDH 具有啟用, 堆棧跟蹤程序上運作, 但由于您設定标志, 不重新應用日志中可能會收到以下消息:

沒有用于此配置設定儲存堆棧跟蹤 () 索引 = = 0

如果您運作不要設定正确符号路徑或符号不正确, 和運作 UMDH, 日志中可能會收到錯誤消息。 但是, 隻出現錯誤或誤導 callstacks。 若要驗證是否有正确符号, 例如啟動對程序, NTSD 系統調試器:

ntsd 記事本

然後, 從調試器控制台, 運作 <b>LD </b>指令以加載符号資訊對子產品和 <b>LM </b>指令以子產品有加載其符号清單。 如果 <b>LM </b>指令的輸出顯示導出符号加載, 符号是不好。 如果您有加載, PDB 符号符号是好。 如果指定錯誤 PID 可能出現以下錯誤資訊:

OpenProcess 失敗, LastError = 0x57

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

最初可能有時用于轉儲随着時間的日志數量因為洩漏可能不很明顯。 例如, 如果懷疑 Active Server Pages (ASP) Web 應用程式, 是洩漏記憶體, 它可能有助于出 shells, VisualBasic 中寫入 UMDH COM 元件。 然後可從您的 ASP 頁調用該元件。

下面是一些 VisualBasic 代碼調用 UMDH, 建立一個日志檔案是基于目前時間:<code></code>

<code></code>

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

Windows NT 4.0 上無效 UMDH 工具随 DebuggingToolsforWindows 産品一起提供。 自解壓縮可執行 (Umdhnt4tools.exe) 是随本文并包含以下工具用于與 NT 4.0:

Umdh_nt4.exe 和 Dbghelp.dll

這是 UMDH 實用程式的 Windows NT 4.0 SP 6 版本。

Dhcmp.exe

此工具用于比較兩 UMDH 轉儲以确定其中可能記憶體洩漏 occurrs。

可用于從 Microsoft 下載下傳中心下載下傳下列檔案:

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

August 28, 2002 釋出日期:

有關如何下載下傳 Microsoft 支援檔案, 請單擊下列文章編号以檢視 Microsoft 知識庫中相應:

此檔案進行病毒掃描 Microsoft。 Microsoft 使用最新病毒檢測軟體, 投遞檔案日期上的可用。 檔案存儲在安全增強型伺服器有助于防止未經授權更改對該檔案。 檔案夾, 置于 Umdh_nt4.exe 和 Dbghelp.dll 并再将它們首先在 PATH 環境變量。 使用 Umdh_nt4.exe 代替 UMDH。 

是運作 Windows NT 4.0, 計算機上必須使用 Gflags.exe 來設定系統級堆棧跟蹤。 例如:

請確定您重新啟動計算機。 WindowsNT 版本 4.0 上逐個程序無效 Umdh_nt4 堆棧跟蹤。 設定對整個系統。 

與 UMDH UMDH_NT4 是, 它不比較日志檔案。 例如, 您無法執行以下操作:

UMDH_NT4 dh1.log dh2.log &gt; cmp12.txt

而必須使用 Dhcmp.exe 工具所附帶本文。 類似于以下指令:

DHCMP dh1.log dh2.log &gt; cmp12.txt

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

<a></a>

Microsoft Windows 2000 Server

Microsoft Windows 2000 Advanced Server

Microsoft Windows 2000 Professional Edition

Microsoft Windows NT Server 4.0 Standard Edition

Microsoft Windows NT Workstation 4.0 Developer Edition

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

kbdownload kbarttypeshowme kbfile kbgraphxlinkcritical kbhowto kbsample KB268343 KbMtzh kbmt

Umdhtools.exe: 如何使用 umdh.exe 來查找記憶體洩漏

Microsoft和/或其各供應商對于為任何目的而在本伺服器上釋出的檔案及有關圖形所含資訊的适用性,不作任何聲明。 所有該等檔案及有關圖形均"依樣"提供,而不帶任何性質的保證。Microsoft和/或其各供應商特此聲明,對所有與該等資訊有關的保證和條件不負任何責任,該等保證和條件包括關于适銷性、符合特定用途、所有權和非侵權的所有默示保證和條件。在任何情況下,在由于使用或運作本伺服器上的資訊所引起的或與該等使用或運作有關的訴訟中,Microsoft和/或其各供應商就因喪失使用、資料或利潤所導緻的任何特别的、