溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障

發(fā)布時間:2020-06-16 21:49:31 來源:網(wǎng)絡(luò) 閱讀:2893 作者:UltraSQL 欄目:數(shù)據(jù)庫

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障

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


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

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

下載并安裝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”。

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障


2.定位到“rules”標(biāo)簽頁,并選擇“add rule”。

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

4.選擇SQL Server或者跟蹤用于內(nèi)存泄漏的任何進程。

5.點擊“Next”并保留默認(rèn)選項(當(dāng)規(guī)則是完成或失效時,你可以選擇“auto-unload Leak track”)。

6.點擊“Next”并現(xiàn)在激活規(guī)則。

7.Leaktrack.dll已經(jīng)加入到用于跟蹤分配的進程里。

8.現(xiàn)在你可以等待泄漏再次發(fā)生。

-- 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.當(dāng)你猜測內(nèi)存泄漏時,定位到“rules”,并通過右擊“Leak rule”執(zhí)行一個完整的用戶dump。

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障


10.在dump被捕獲后,定位到高級分析標(biāo)簽頁,添加數(shù)據(jù)文件并選擇我們生成的dump。

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

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

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

13.點擊“Start Analysis”。

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障


14.根據(jù)加載符號的時間消耗,分析可能要花費一點時間。當(dāng)分析完成,會生成并打開一個HTML報告。這個HTML報告默認(rèn)存儲在C:\Program Files\DebugDiag\Reports\ 可以用于后續(xù)參考。

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

Debug Diagnostic Tool的內(nèi)存壓力分析器生成的報表有分析總結(jié)和以下表格內(nèi)存。

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.分析總結(jié)是報表中不錯部分定位哪個模塊泄漏了內(nèi)存。查看以下報表。

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障


16.報表已清晰的表明HeapLeak.dll有255MB顯著的分配。在heapleak.dll里“Sub”函數(shù)用于在偏移量23處分配了該內(nèi)存。

17.查看虛擬內(nèi)存總結(jié)。它給出了在虛擬地址孔家哪里關(guān)于內(nèi)存分布的完整圖片。在以下摘要里保留是1.57GB,這在32位SQL Server里是正常的,但是本地堆內(nèi)存有272.94MB是不正常的。

查看堆摘要,有50個堆。

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障18.現(xiàn)在查看顯著的分配總結(jié)。它給出了分配總數(shù)和分配大小的前10個模塊。在以下摘要HeapLeak占用255.6MB大小里的26182。
注意:在這個報表里它是HeapLeak,但是在實踐中它可能是泄漏內(nèi)存的任何模塊。

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障


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

使用Debug Diagnostic Tool排除內(nèi)存泄漏故障


現(xiàn)在我們確認(rèn)HeapLeak.dll里的Sub函數(shù)在行號為14位置分配了255MB,并且未釋放。這個報表也給你callstack示例,顯示了當(dāng)函數(shù)分配內(nèi)存時的代碼路徑。參考示例HTML報表文件http://sdrv.ms/TH1qfR。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI