使用 UMDH 之前
如果您認(rèn)為您遇到內(nèi)存泄漏, 應(yīng)注意, 內(nèi)存泄漏可能不它們似乎什么。 您可能發(fā)現(xiàn)內(nèi)存泄漏是不滿(mǎn)足內(nèi)存泄漏, 但是性能增強(qiáng)。 例如, MicrosoftJet 數(shù)據(jù)庫(kù)引擎會(huì)消耗大量?jī)?nèi)存因?yàn)樗鼨z索數(shù)據(jù)并寫(xiě)入緩存 256 - MB 計(jì)算機(jī)上 (最多 128 MB)。 緩存允許 Jet 引擎以獲得快速讀和寫(xiě)提前緩沖。
要確定是否是一個(gè)進(jìn)程遇到內(nèi)存泄漏, 使用 Windows 性能監(jiān)視器 (Perfmon.exe) 并為應(yīng)用程序進(jìn)程類(lèi)別下監(jiān)視專(zhuān)用字節(jié)。 專(zhuān)用字節(jié)是總內(nèi)存, 進(jìn)程已分配, 但不是與其他進(jìn)程共享。 注意這是不同于 VirtualBytes, 即有趣來(lái)監(jiān)視。 虛擬字節(jié)是以字節(jié)表示的虛擬地址空間, 進(jìn)程使用當(dāng)前大小。 應(yīng)用程序可泄漏虛擬內(nèi)存, 但可能沒(méi)有看到分配專(zhuān)用字節(jié)中差別。 如果看不到當(dāng)監(jiān)視專(zhuān)用字節(jié), 但懷疑仍然運(yùn)行用盡了內(nèi)存, 增加內(nèi)存監(jiān)視虛擬字節(jié)以查看備份虛擬內(nèi)存是否正在使用。 有關(guān)檢測(cè)內(nèi)存泄漏, 附加信息請(qǐng)參閱以下 Microsoft Developer Network (MSDN) Web 站點(diǎn)上 " 查找 Leaks 和瓶頸與 WindowsNT PerfMon COM 對(duì)象 " 文章:
要確保應(yīng)用程序, 是泄漏內(nèi)存, 可疑代碼放在循環(huán)與許多迭代, 并然后監(jiān)視對(duì)任何提高的內(nèi)存和虛擬專(zhuān)用字節(jié)。 觀看以確保不的專(zhuān)用字節(jié)和虛擬字節(jié)數(shù)不最終保持相同, 并且停止數(shù)增加。 如果沒(méi)有內(nèi)存增加, 停止時(shí)間點(diǎn)看不到內(nèi)存泄漏但更可能, 到緩存, 增長(zhǎng)至其最大尺寸 (例如, 它并不繼續(xù)到 climb 無(wú)限)。
如果您決定使用 UMDH 之前,, 您看到內(nèi)存泄漏, 請(qǐng)按照下列步驟:
1. | 安裝 UMDH 實(shí)用程序。 |
2. | 設(shè)置要安裝 UMDH 文件夾 PATH 系統(tǒng)環(huán)境變量。 |
3. | 將 _ NT _ SYMBOL _ PATH 環(huán)境變量設(shè)置為 Microsoft 符號(hào)服務(wù)器路徑以便 UMDH 可以找到調(diào)試符號(hào)文件。 |
UMDH 工具是隨 DebuggingToolsforWindows 產(chǎn)品下面的 Microsoft Web 站點(diǎn):
下載和安裝實(shí)用程序, 并將 PATH 系統(tǒng)環(huán)境變量到路徑其中已安裝調(diào)試工具。
使用 UMDH 之前, 必須安裝用于組成應(yīng)用程序和操作系統(tǒng)正確調(diào)試符號(hào)。 用于 MicrosoftSymbolServer 獲取調(diào)試符號(hào)對(duì)于 Microsoft 組件。 有關(guān) MicrosoftSymbolServer, 請(qǐng)單擊文章編號(hào)以查看 Microsoft 知識(shí)庫(kù)中相應(yīng):
311503 (http://support.microsoft.com/kb/311503/EN-US/) 使用 Microsoft 符號(hào)服務(wù)器來(lái)獲取調(diào)試符號(hào)文件
UMDH 嘗試通過(guò)使用 _ NT _ SYMBOL _ PATH 環(huán)境變量查找符號(hào)文件。 命令以從命令提示符設(shè)置路徑可能與以下類(lèi)似:
設(shè)置 _ NT _ SYMBOL _ PATH = SRV c:\LocalSymbolCache *
其他有關(guān)設(shè)置符號(hào)調(diào)試信息, 請(qǐng)參閱本文中后面 " 調(diào)試符號(hào) " 部分。
在完成這些步驟, 您就可以使用 UMDH 實(shí)用程序。
與 UMDH 轉(zhuǎn)儲(chǔ)捕獲堆
UMDH 是實(shí)用工具, 轉(zhuǎn)儲(chǔ)堆分配的進(jìn)程信息。 此信息包括調(diào)用堆棧用于每個(gè)分配、 次數(shù), 通過(guò)調(diào)用該堆棧, 進(jìn)行分配和的消耗, 通過(guò)調(diào)用該堆棧字節(jié)數(shù)。 例如:
00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D
UMDH 輸出顯示, 沒(méi)有 21280 (0x5320) 從調(diào)用堆棧分配字節(jié)總數(shù)。 從 20 21280 字節(jié)被分配單獨(dú)分配的 1064 字節(jié) (0x428) (0 x 14)。 標(biāo)識(shí)符是 BackTrace00053 提供調(diào)用堆棧。
要生成轉(zhuǎn)儲(chǔ)文件的堆分配, 您必須使用 Gflags.exe 實(shí)用程序, 也是隨 DebuggingToolsforWindows 產(chǎn)品, 來(lái)讓操作系統(tǒng)知道您想要跟蹤分配內(nèi)核。
假設(shè)您要為 Notepad.exe 轉(zhuǎn)儲(chǔ) heap(s) 內(nèi)容。 必須首先啟用堆棧跟蹤獲取用于對(duì)要測(cè)試該應(yīng)用程序。 默認(rèn)情況下, 不啟用此功能。 要啟用此功能命令是如下: gflags notepad.exe + ust - i
命令不啟用堆棧跟蹤為進(jìn)程到已經(jīng)運(yùn)行, 但使堆棧跟蹤對(duì)于所有將來(lái)執(zhí)行是 Notepad.exe。 通過(guò) GFLAGS 用戶(hù)界面 (不帶任何參數(shù)以獲得用戶(hù)界面運(yùn)行 Gflags.exe) 或者, 您可設(shè)置標(biāo)志。 使用
- ust 選項(xiàng)對(duì)于 gflags 以禁用堆棧跟蹤時(shí), 調(diào)試已完成。
當(dāng)您通過(guò) Gflags.exe, 圖像標(biāo)志設(shè)并且設(shè)置調(diào)試符號(hào), 您就可以啟動(dòng)記事本, 使用 UMDH (應(yīng)用)。 啟動(dòng)程序后, 必須確定進(jìn)程 ID (PID) 的只啟動(dòng)記事本進(jìn)程。 對(duì)于此命令是如下:
tlist
您可以找到從輸出 TLIST 應(yīng)用程序的 PID。 PID 信息也可獲得從任務(wù)管理器。 假定對(duì)于記事本過(guò)程, 您只啟動(dòng) PID 是 124。 可使用 UMDH 來(lái)獲取堆轉(zhuǎn)儲(chǔ)使用以下命令:
umdh - p 124 個(gè) - f:notepad124.log:
結(jié)果 : Notepad124.log 文件中有完整堆的 Notepad 進(jìn)程轉(zhuǎn)儲(chǔ)。 此文件顯示所有所做的分配和 callstacks 其中進(jìn)行分配。
使用 umdh.exe 來(lái)比較 UMDH 日志
如果不關(guān)心查找內(nèi)存泄漏, UMDH 日志文件包含對(duì)進(jìn)程, 堆的當(dāng)前狀態(tài)寶貴信息時(shí)可能會(huì)更重要來(lái)比較的兩個(gè)日志輸出和了解哪些調(diào)用堆棧已看到大增長(zhǎng)兩轉(zhuǎn)儲(chǔ)文件之間。 Umdh.exe 實(shí)用程序幫助比較兩 UMDH 日志以提供分析之間差。 一旦有兩個(gè)日志捕獲不同間隔, 可再使用以下命令:
UMDH dh1.log dh2.log > cmp12.txt
- 或 -
UMDH -d dh1.log dh2.log > cmp12.txt
- d 命令行選項(xiàng)通知 UMDH 以在十進(jìn)制代替十六進(jìn)制顯示。 命令的輸出比較差異的分配之間兩個(gè)日志并提供是類(lèi)似于以下信息:
+ 5320 (f110 - 9df0) = = 5320 3a allocs BackTrace00053 總數(shù)增加
對(duì)于每 BackTrace, UMDH 日志文件中沒(méi)有兩個(gè)日志文件之間進(jìn)行比較。 本例說(shuō)明最后一個(gè)日志文件 UMDH 命令行中指定有 0xF110 對(duì)于相同 BackTrace 調(diào)用 (堆棧) 分配字節(jié)分配 UMDH 命令行中第一個(gè)日志具有 0x9DF0 時(shí)字節(jié) UMDH 命令行中第一個(gè)日志具有 0x9DF0 時(shí)分配字節(jié)對(duì)于同一 BackTrace (調(diào)用堆棧) 分配字節(jié)。 " 5320 " 是分配的字節(jié)數(shù)中差別。 此例, 沒(méi)有 0x5320 多字節(jié)時(shí)間之間分配兩日志被捕獲。 字節(jié)來(lái)自調(diào)用堆棧, 由 " BackTrace00053 "。
下一步是要了解什么是該 backtrace 中。 如果打開(kāi)二日志文件和搜索
BackTrace00053 , 可能發(fā)現(xiàn)內(nèi)容, 類(lèi)似于以下內(nèi)容:
00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D
當(dāng)您查看調(diào)用堆棧, 您可以看到, LeakyFunc 函數(shù)分配內(nèi)存通過(guò) VisualC++ 運(yùn)行時(shí)庫(kù)運(yùn)算符新函數(shù)。 如果發(fā)現(xiàn), 分配的數(shù)增大如采取多轉(zhuǎn)儲(chǔ)文件, 您可能斷定不被釋放內(nèi)存。 啟用堆棧跟蹤
UMDH 日志中最重要信息是堆棧跟蹤的堆分配。 您可以分析地驗(yàn)證如果進(jìn)程堆內(nèi)存泄漏。 默認(rèn)情況下, 這些堆棧跟蹤不獲取。 您可啟用此功能每個(gè)進(jìn)程或系統(tǒng)級(jí)。 使用以下命令以啟用堆棧跟蹤系統(tǒng)級(jí):
gflags -r + ust
此命令后重新啟動(dòng)計(jì)算機(jī)。 有關(guān)每個(gè)進(jìn)程啟用, 命令是如下:
gflags APPNAME + ust - i
其中
APPNAME 是包括擴(kuò)展名 (例如, Services.exe, Lsass.exe) 可執(zhí)行的文件名。 命令不啟用堆棧跟蹤為進(jìn)程已運(yùn)行。 因此, 對(duì)于進(jìn)程, 無(wú)法重新 (用于示例、 服務(wù)、 lsass、 winlogon), 您必須重新啟動(dòng)測(cè)試計(jì)算機(jī)。
使用以下命令以驗(yàn)證哪些設(shè)置已設(shè)置系統(tǒng)級(jí)或特定進(jìn)程: 系統(tǒng)范圍:: 系統(tǒng)范圍:
gflags - r
特定進(jìn)程:
gflags APP - 名稱(chēng) - i
默認(rèn)情況下, 大堆棧跟蹤深度是 16。 如果要查看深 callstacks, 可以通過(guò)運(yùn)行 GFLAGS 增加此。 單擊以選中
系統(tǒng)注冊(cè)表 , 然后鍵入新深度
Max. 堆棧跟蹤捕獲深度 編輯控件中。 單擊
應(yīng)用 , 并重新啟動(dòng)計(jì)算機(jī)。
要點(diǎn) : 如果正在使用 Windows NT 4.0 Service Pack 6, 您必須使用 Umdh_nt4.exe, 代替 Umdh.exe, 并且您必須使用
gflags - r 命令來(lái)設(shè)置系統(tǒng)級(jí)堆棧跟蹤。 請(qǐng)確保您重新啟動(dòng)計(jì)算機(jī)。 WindowsNT 版本 4 上每流程基礎(chǔ)上無(wú)效 Umdh_nt4 堆棧跟蹤。 它必須為整個(gè)系統(tǒng)設(shè)置。
調(diào)試符號(hào)
最重要步驟以使用 UMDH 之一是以確保您具有好符號(hào)文件 (.dbg 或 .pdb 文件) 以獲得良好堆棧跟蹤。 至少, 您需要 Kernel32.dbg 和 Ntdll.dbg 符號(hào)文件。 您可以獲得其他調(diào)試符號(hào), 您可能需要與您了解多關(guān)于哪些組件泄漏內(nèi)存。 有關(guān)如何獲取 Microsoft 組件, 調(diào)試符號(hào)文件請(qǐng)單擊文章編號(hào)以查看 Microsoft 知識(shí)庫(kù)中相應(yīng):
311503 (http://support.microsoft.com/kb/311503/EN-US/) INFO: 使用 Microsoft 符號(hào)服務(wù)器來(lái)獲取調(diào)試符號(hào)文件
有關(guān)如何使用 MicrosoftSymbolServer 以及如何獲取 Windows 符號(hào)程序包, 請(qǐng)?jiān)L問(wèn) Microsoft Web 站點(diǎn):
當(dāng)您生成組件與 VisualC++, 值得您沒(méi)有將程序數(shù)據(jù)庫(kù)用于編輯和繼續(xù)選擇用于 C++ 編譯器選項(xiàng)。 相反, 選擇程序數(shù)據(jù)庫(kù)。 將符號(hào)路徑, 初始化到路徑用于 _ NT _ SYMBOL _ PATH 環(huán)境變量。 您可以使用 Microsoft 符號(hào)服務(wù)器來(lái)獲取用于 Microsoft 組件符號(hào)。
311503 (http://support.microsoft.com/kb/311503/EN-US/) INFO: 使用 Microsoft 符號(hào)服務(wù)器來(lái)獲取調(diào)試符號(hào)文件
請(qǐng)按照下列步驟來(lái)設(shè)置 _ NT _ SYMBOL _ PATH 環(huán)境變量:
1. | 在控制面板, 雙擊 系統(tǒng) 。 |
2. | 單擊 高級(jí) 選項(xiàng)卡, 然后再單擊 環(huán)境變量。 |
也可以在命令窗口運(yùn)行 UMDH 之前設(shè)置 _ NT _ SYMBOL _ PATH 環(huán)境變量。
注意 : 也包括到 PDB 對(duì)組件的應(yīng)用程序路徑。 例如, _ NT _ SYMBOL _ PATH 路徑設(shè)置為以下:
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\myapplicationssymbols
第第一部分對(duì)此路徑指向 MicrosoftSymbolServer 并指出 c:\symbols 文件夾中, 將下載符號(hào)使用。 分號(hào)后面部分是到 PDB 文件 (符號(hào)文件) 專(zhuān)門(mén)為泄漏應(yīng)用程序路徑。
調(diào)用 UMDH
只需要命令行參數(shù)對(duì)于 UMDH 是
- p 選項(xiàng), 指定將從中獲取堆轉(zhuǎn)儲(chǔ)進(jìn)程的 PID。 通過(guò)使用任務(wù)管理器或 Tlist.exe 程序獲得 PID。 轉(zhuǎn)日志為類(lèi)似于以下, 命令將被儲(chǔ)到標(biāo)準(zhǔn)輸出:
umdh - p PID:
向標(biāo)準(zhǔn)錯(cuò)誤, UMDH 還顯示各種信息性消息并因此如果您不執(zhí)行重定向其, 與實(shí)際日志混合它。 以收集 UMDH 信息性消息文件, 中使用以下命令:
umdh - p PID 2>umdh.msg:
如果要收集日志是由文件, 中 UMDH 轉(zhuǎn)儲(chǔ), 使用下列命令之一:
umdh - p PID: umdh.log
- 或 -
umdh f:umdh.log PID - - p:
這些命令是等效。
通過(guò) UMDH 獲得默認(rèn)日志包含枚舉是堆消費(fèi)者, 按分配計(jì)數(shù)排序。 如果還需要所有與其相應(yīng)堆棧跟蹤, 分配塊的轉(zhuǎn)儲(chǔ)文件用于調(diào)試目的,
- d 選項(xiàng)用于:
umdh - p PID - d:
如果使用此命令, 您可能看到以下 UMDH 日志文件中:
對(duì)于跟蹤 BackTrace00046 分配 005F69A0 005F6150:
這些是用于調(diào)用該堆棧分配的內(nèi)存地址。 如果將調(diào)試器附加到進(jìn)程, 您可轉(zhuǎn)儲(chǔ)內(nèi)存要查看哪些已分配這些地址上的內(nèi)容。
如果日志包含太多信息, 就可以?xún)H限于那些具有分配大用戶(hù)計(jì)數(shù)超過(guò)特定閾值。 使用以下命令:
umdh - p PID - t: THRESHOLD:
所有命令行選項(xiàng) (例如, - p、 - f, - t、 - d) 同時(shí)指定按任何順序。 下面是更難命令行示例:
umdh - p 123: 1000 - f:umdh.log - d - t:
此命令將轉(zhuǎn)儲(chǔ)堆對(duì)于過(guò)程與 PID 123 到 Umdh.log 文件。 它轉(zhuǎn)儲(chǔ)只堆棧跟蹤, 帳戶(hù)超過(guò) 1000 分配和它的堆塊通過(guò)每個(gè)堆棧跟蹤分配地址還轉(zhuǎn)儲(chǔ)。
另一個(gè)有用 UMDH 選項(xiàng)是
- l 選項(xiàng)。 這導(dǎo)致要盡可能調(diào)用堆棧中打印文件和行號(hào)。
解釋 UMDH 輸出
如果您重定向到文件日志 (PID -:
umdh,) 內(nèi)容是類(lèi)似于以下, 從運(yùn)行 Notepad 進(jìn)程已獲得它 - p: f:umdh.log UMDH: Logtime 2000-06-28 10:54 - Machine=MYMachine - PID=704
*********** Heap 00270000 Information ********************
Flags: 58000062
Number Of Entries: 87
Number Of Tags: <unknown>
Bytes Allocated: 00008DF0
Bytes Committed: 0000A000
Total FreeSpace: 00001210
Number of Virtual Address chunks used: 1
Address Space Used: <unknown>
Entry Overhead: 8
Creator: (Backtrace00007)
ntdll!RtlDebugCreateHeap+0x00000196
ntdll!RtlCreateHeap+0x0000023F
ntdll!LdrpInitializeProcess+0x00000369
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007
*********** Heap 00270000 Hogs ********************
000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00031
ntdll!RtlDebugAllocateHeap+0x000000FB
ntdll!RtlAllocateHeapSlowly+0x0000005B
ntdll!RtlAllocateHeap+0x00000D81
ntdll!LdrpAllocateDataTableEntry+0x00000039
ntdll!LdrpMapDll+0x000002A4
ntdll!LdrpLoadImportModule+0x0000010D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpInitializeProcess+0x000009DC
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007
000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00034
ntdll!RtlDebugAllocateHeap+0x000000FB
ntdll!RtlAllocateHeapSlowly+0x0000005B
ntdll!RtlAllocateHeap+0x00000D81
ntdll!LdrpAllocateDataTableEntry+0x00000039
ntdll!LdrpMapDll+0x000002A4
ntdll!LdrpLoadImportModule+0x0000010D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpInitializeProcess+0x000009DC
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007
日志包含的進(jìn)程中每個(gè)堆轉(zhuǎn)儲(chǔ)。 在本示例, 日志開(kāi)頭 270000 地址處堆。 對(duì)于堆, 幾全局計(jì)數(shù)器后日志包含按減少排序順序的大多數(shù)分配負(fù)責(zé)堆棧跟蹤轉(zhuǎn)儲(chǔ)。 比較不同時(shí)間, 上所使用的內(nèi)存動(dòng)態(tài)時(shí), 可推斷進(jìn)程中發(fā)生什么, 如果任何堆使用它類(lèi)似于泄漏。 使用 UMDH 時(shí), 您可能會(huì)遇到問(wèn)題
因?yàn)槲磫⒂枚褩8櫚l(fā)生常見(jiàn)錯(cuò)誤使用 UMDH 時(shí)。 也, 用于 Ntdll.dll 正確符號(hào)使 UMDH 無(wú)法運(yùn)行。 對(duì)于其他符號(hào)文件, UMDH 運(yùn)行但日志文件包含堆棧跟蹤沒(méi)有函數(shù)名稱(chēng), 但而具有內(nèi)部模塊相對(duì)地址。 遠(yuǎn)程三錯(cuò)誤指定錯(cuò)誤 PID。 當(dāng)您嘗試為沒(méi)有啟用堆棧跟蹤過(guò)程運(yùn)行 UMDH 產(chǎn)生以下錯(cuò)誤信息:
C:\>umdh = MyMachine - PID 1140 UMDH = 1140 連接正在完成模塊枚舉 logtime 06 28 2000 - - - p:: 12:43 - 計(jì)算機(jī)。 SymGetSymFromName(process, ntdll!RtlpStackTraceDataBase, xxx) 失敗, LastError = 126 ntdll UmdhGetAddrFromName 未能找到堆棧跟蹤 DB 指針) RtlpStackTraceDataBase ! (。 ntdll.dll 符號(hào)不正確 ; 我們必須能夠看到非導(dǎo)入符號(hào)。
使用以下命令來(lái)復(fù)查過(guò)程, 您正在調(diào)查設(shè)置:
gflags APPNAME - i
您依賴(lài)于系統(tǒng)級(jí)堆棧跟蹤時(shí)使用以下命令:
gflags - r
這些命令顯示 flags 設(shè)置為應(yīng)用程序的列表。 注意如果是系統(tǒng)級(jí)堆棧跟蹤, 功能可能顯示為活動(dòng)但實(shí)際上不激活如果您找不重新啟動(dòng)計(jì)算機(jī)運(yùn)行
gflags -r + ust 命令, 后。 如果要了解具有啟用, 堆棧跟蹤每個(gè)應(yīng)用程序可查看以下注冊(cè)表項(xiàng)下 USTEnabled 項(xiàng):
HKEY NT\CurrentVersion\Image 文件執(zhí)行選項(xiàng)
如果 UMDH 具有啟用, 堆棧跟蹤進(jìn)程上運(yùn)行, 但由于您設(shè)置標(biāo)志, 不重新應(yīng)用日志中可能會(huì)收到以下消息:
沒(méi)有用于此分配保存堆棧跟蹤 () 索引 = = 0
如果您運(yùn)行不要設(shè)置正確符號(hào)路徑或符號(hào)不正確, 和運(yùn)行 UMDH, 日志中可能會(huì)收到錯(cuò)誤消息。 但是, 只出現(xiàn)錯(cuò)誤或誤導(dǎo) callstacks。 若要驗(yàn)證是否有正確符號(hào), 例如啟動(dòng)對(duì)進(jìn)程, NTSD 系統(tǒng)調(diào)試器:
ntsd 記事本
然后, 從調(diào)試器控制臺(tái), 運(yùn)行
LD 命令以加載符號(hào)信息對(duì)模塊和
LM 命令以模塊有加載其符號(hào)列表。 如果
LM 命令的輸出顯示導(dǎo)出符號(hào)加載, 符號(hào)是不好。 如果您有加載, PDB 符號(hào)符號(hào)是好。 如果指定錯(cuò)誤 PID 可能出現(xiàn)以下錯(cuò)誤信息:
OpenProcess 失敗, LastError = 0x57
從 VisualBasic 調(diào)用 UMDH
最初可能有時(shí)用于轉(zhuǎn)儲(chǔ)隨著時(shí)間的日志數(shù)量因?yàn)樾孤┛赡懿缓苊黠@。 例如, 如果懷疑 Active Server Pages (ASP) Web 應(yīng)用程序, 是泄漏內(nèi)存, 它可能有助于出 shells, VisualBasic 中寫(xiě)入 UMDH COM 組件。 然后可從您的 ASP 頁(yè)調(diào)用該組件。
下面是一些 VisualBasic 代碼調(diào)用 UMDH, 創(chuàng)建一個(gè)日志文件是基于當(dāng)前時(shí)間:
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Function GetProcessID()
GetProcessID = GetCurrentProcessId()
End Function
.
.
.
Dim strTime As String
Dim sProcID As String
sProcID = GetProcessID()
strTime = "MYLOG_" & Format(Now(), "hhmm")
Shell ("C:\UMDH\umdh -p:" & sProcID & " -f:d:\logs\" & strTime & ".txt")
使用 Windows NT 4.0 服務(wù)軟件包 6a UMDH (SP6a)
Windows NT 4.0 上無(wú)效 UMDH 工具隨 DebuggingToolsforWindows 產(chǎn)品一起提供。 自解壓縮可執(zhí)行 (Umdhnt4tools.exe) 是隨本文并包含以下工具用于與 NT 4.0:
? | Umdh_nt4.exe 和 Dbghelp.dll 這是 UMDH 實(shí)用程序的 Windows NT 4.0 SP 6 版本。 |
? | Dhcmp.exe 此工具用于比較兩 UMDH 轉(zhuǎn)儲(chǔ)以確定其中可能內(nèi)存泄漏 occurrs。 |
可用于從 Microsoft 下載中心下載下列文件:
August 28, 2002 發(fā)布日期:
有關(guān)如何下載 Microsoft 支持文件, 請(qǐng)單擊下列文章編號(hào)以查看 Microsoft 知識(shí)庫(kù)中相應(yīng):
119591 (http://support.microsoft.com/kb/119591/EN-US/) 如何從聯(lián)機(jī)服務(wù)獲取 Microsoft 支持文件
此文件進(jìn)行病毒掃描 Microsoft。 Microsoft 使用最新病毒檢測(cè)軟件, 投遞文件日期上的可用。 文件存儲(chǔ)在安全增強(qiáng)型服務(wù)器有助于防止未經(jīng)授權(quán)更改對(duì)該文件。 文件夾, 置于 Umdh_nt4.exe 和 Dbghelp.dll 并再將它們首先在 PATH 環(huán)境變量。 使用 Umdh_nt4.exe 代替 UMDH。
是運(yùn)行 Windows NT 4.0, 計(jì)算機(jī)上必須使用 Gflags.exe 來(lái)設(shè)置系統(tǒng)級(jí)堆棧跟蹤。 例如:
gflags - r
請(qǐng)確保您重新啟動(dòng)計(jì)算機(jī)。 WindowsNT 版本 4.0 上逐個(gè)進(jìn)程無(wú)效 Umdh_nt4 堆棧跟蹤。 設(shè)置對(duì)整個(gè)系統(tǒng)。
與 UMDH UMDH_NT4 是, 它不比較日志文件。 例如, 您無(wú)法執(zhí)行以下操作:
UMDH_NT4 dh1.log dh2.log > cmp12.txt
而必須使用 Dhcmp.exe 工具所附帶本文。 類(lèi)似于以下命令:
DHCMP dh1.log dh2.log > cmp12.txt