使用Debug Diagnostic Tool排除内存泄漏故障
admin
2023-06-09 04:21:16
0次

使用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”。

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


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。

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


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”。

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


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.分析总结是报表中不错部分定位哪个模块泄漏了内存。查看以下报表。

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


16.报表已清晰的表明HeapLeak.dll有255MB显著的分配。在heapleak.dll里“Sub”函数用于在偏移量23处分配了该内存。

17.查看虚拟内存总结。它给出了在虚拟地址孔家哪里关于内存分布的完整图片。在以下摘要里保留是1.57GB,这在32位SQL Server里是正常的,但是本地堆内存有272.94MB是不正常的。

查看堆摘要,有50个堆。

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

使用Debug Diagnostic Tool排除内存泄漏故障18.现在查看显著的分配总结。它给出了分配总数和分配大小的前10个模块。在以下摘要HeapLeak占用255.6MB大小里的26182。
注意:在这个报表里它是HeapLeak,但是在实践中它可能是泄漏内存的任何模块。

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


19.你也可以查看详细的模块报告(Memory)。它给出了内存分配,从每个模块以及函数和分配内存的源行(如果你对所有加载的模块设置符号)。

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


现在我们确认HeapLeak.dll里的Sub函数在行号为14位置分配了255MB,并且未释放。这个报表也给你callstack示例,显示了当函数分配内存时的代码路径。参考示例HTML报表文件http://sdrv.ms/TH1qfR。


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...