使用Debug Diagnostic Tool排除內存泄漏故障

使用Debug Diagnostic Tool排除內存泄漏故障

翻譯自:https://mssqlwiki.com/2012/12/06/debugging-memory-leaks-using-debug-diagnostic-tool/


在我之前的博文中(SQL Server內存泄漏),我解釋瞭如何使用“!heap”命令識別哪個模塊泄漏了內存。有時我們使用“!d”命令來找到模型或者使用搜索內存命令(s)不能通過顯示內存找到原因。

在這種情況下,我們可以使用Debug Diagnostic Tools或者UMDH來跟蹤內存泄漏。這篇博文解釋瞭如何使用Debug Diagnostics Tools來識別內存泄漏。

下載並安裝Debug Diagnostic Tools從http://www.microsoft.com/en-us/download/details.aspx?id=26798

1.定位到Tools,“Options”->“Preferences”,選擇“Record call stacks immediately when monitoring the leaks”。

clip_image0021.jpg


2.定位到“rules”標籤頁,並選擇“add rule”。

3.選擇“Naive(non .Net) memory leak and handle leak”。

4.選擇SQL Server或者跟蹤用於內存泄漏的任何進程。

5.點擊“Next”並保留默認選項(當規則是完成或失效時,你可以選擇“auto-unload Leak track”)。

6.點擊“Next”並現在激活規則。

7.Leaktrack.dll已經加入到用於跟蹤分配的進程裏。

8.現在你可以等待泄漏再次發生。

-- If you are learning how to troubleshoot SQL Server memory leak follow the steps which we followed in previous post (https://mssqlwiki.com/2012/12/04/sql-server-memory-leak/)to leak the memory.
-- Download HeapLeak.dll from this link.
-- Create  an extended stored procedure in SQL Server
sp_addextendedproc ‘HeapLeak’,‘C:\HeapLeakdll\HeapLeak.dll’
-- Let us execute this Extended SP 30 times and leak memory.
exec HeapLeak
go 30


9.當你猜測內存泄漏時,定位到“rules”,並通過右擊“Leak rule”執行一個完整的用戶dump。

clip_image004.jpg


10.在dump被捕獲後,定位到高級分析標籤頁,添加數據文件並選擇我們生成的dump。

11.定位到Tools,“Options”->“set the symbol path for analysis”。默認的Microsoft symbol path在下面。

srv*c:\Websymbols*http://msdl.microsoft.com/download/symbols;c:\Release
重要的:使用加載到SQL Server裏的DLL的符號路徑替代c:\Release (可選的)

12.在可用的分析腳本,選擇內存壓力分析器(memory analysis.asp)。

13.點擊“Start Analysis”。

clip_image006.jpg


14.根據加載符號的時間消耗,分析可能要花費一點時間。當分析完成,會生成並打開一個HTML報告。這個HTML報告默認存儲在C:\Program Files\DebugDiag\Reports\ 可以用於後續參考。

我附加了一個使用heapleak.dll內存泄漏時收集的示例報表,在這裏http://sdrv.ms/TH1qfR。你可以使用它作爲參考。

Debug Diagnostic Tool的內存壓力分析器生成的報表有分析總結和以下表格內存。

sqlservr.exe__…………dmp
   Virtual Memory Analysis Report
   Heap Analysis Report
   Leak Analysis Report
   Outstanding allocation summary
    Detailed module report (Memory)
    Detailed module report (Handles)

15.分析總結是報表中不錯部分定位哪個模塊泄漏了內存。查看以下報表。

clip_image008.jpg


16.報表已清晰的表明HeapLeak.dll有255MB顯著的分配。在heapleak.dll裏“Sub”函數用於在偏移量23處分配了該內存。

17.查看虛擬內存總結。它給出了在虛擬地址孔家哪裏關於內存分佈的完整圖片。在以下摘要裏保留是1.57GB,這在32位SQL Server裏是正常的,但是本地堆內存有272.94MB是不正常的。

查看堆摘要,有50個堆。

clip_image010.jpg

clip_image012.jpg18.現在查看顯著的分配總結。它給出了分配總數和分配大小的前10個模塊。在以下摘要HeapLeak佔用255.6MB大小裏的26182。
注意:在這個報表裏它是HeapLeak,但是在實踐中它可能是泄漏內存的任何模塊。

clip_image014.jpg


19.你也可以查看詳細的模塊報告(Memory)。它給出了內存分配,從每個模塊以及函數和分配內存的源行(如果你對所有加載的模塊設置符號)。

clip_image016.jpg


現在我們確認HeapLeak.dll裏的Sub函數在行號爲14位置分配了255MB,並且未釋放。這個報表也給你callstack示例,顯示了當函數分配內存時的代碼路徑。參考示例HTML報表文件http://sdrv.ms/TH1qfR。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章