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

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.现在你可以等待泄漏再次发生。
|
1
2
3
4
5
6
7
|
-- 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 Serversp_addextendedproc ‘HeapLeak’,‘C:\HeapLeakdll\HeapLeak.dll’-- Let us execute this Extended SP 30 times and leak memory.exec HeapLeakgo 30 |
9.当你猜测内存泄漏时,定位到“rules”,并通过右击“Leak rule”执行一个完整的用户dump。

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

14.根据加载符号的时间消耗,分析可能要花费一点时间。当分析完成,会生成并打开一个HTML报告。这个HTML报告默认存储在C:\Program Files\DebugDiag\Reports\ 可以用于后续参考。
我附加了一个使用heapleak.dll内存泄漏时收集的示例报表,在这里http://sdrv.ms/TH1qfR。你可以使用它作为参考。
Debug Diagnostic Tool的内存压力分析器生成的报表有分析总结和以下表格内存。
|
1
2
3
4
5
6
7
|
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.分析总结是报表中不错部分定位哪个模块泄漏了内存。查看以下报表。

16.报表已清晰的表明HeapLeak.dll有255MB显著的分配。在heapleak.dll里“Sub”函数用于在偏移量23处分配了该内存。
17.查看虚拟内存总结。它给出了在虚拟地址孔家哪里关于内存分布的完整图片。在以下摘要里保留是1.57GB,这在32位SQL Server里是正常的,但是本地堆内存有272.94MB是不正常的。
查看堆摘要,有50个堆。

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

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

现在我们确认HeapLeak.dll里的Sub函数在行号为14位置分配了255MB,并且未释放。这个报表也给你callstack示例,显示了当函数分配内存时的代码路径。参考示例HTML报表文件http://sdrv.ms/TH1qfR。
使用Debug Diagnostic Tool排除内存泄漏故障的更多相关文章
- UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏
因为.NET的垃圾回收机制相当完善,通常情况下我们是不需要关心内存泄漏的.问题人一但傻起来,连自己都会害怕,几个页面跳啊跳的,内存蹭蹭的往上涨,拉都拉不住.这种时候我们就需要冷静下来,泡一杯热巧克力. ...
- 一次完整的JVM堆外内存泄漏故障排查记录
前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...
- 用WinDbg分析Debug Diagnostic Tool生成的Userdump文件
1.下载WinDbg(Debugging Tools for Windows):http://www.microsoft.com/whdc/devtools/debugging/default.msp ...
- UWP开发入门(十六)——常见的内存泄漏的原因
本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...
- IIS调试技术之 Debug Diagnostic (调试诊断)
IIS 调试技术之 Debug Diagnostic (调试诊断) 1 概述 1.1 文档简介 系统出现错误或崩溃,免不了要进行调试.调试能进行的前提是错误能重现,但实际上要重现一个错误有 ...
- C++的内存泄漏检测
C++大量的手动分配.回收内存是存在风险的,也许一个函数中一小块内存泄漏被重复放大之后,最后掏空内存. 这里介绍一种在debug模式下测试内存泄漏的方法. 首先在文件的开头以确定的顺序写下这段代码: ...
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...
- 上Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题和解决方法
近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比曾经每天40多w发送量暴增到每天达到200w发送量.由于是採用Java做发送底层,压力递增情况下不可避免的 ...
- Windows平台下的内存泄漏检测
在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏. 在windows平台下内存泄漏检测的原理大致如下. 1. 在分 ...
随机推荐
- CSS3/CSS之居中解析(水平+垂直居中、水平居中,垂直居中)
首先,我们来看下垂直居中: (1).如果是单行文本,则可以设置的line-height的数值,让其等于父级元素的高度! <!DOCTYPE html> <html lang=&quo ...
- CSS的border-radius 设置圆弧
现象:将div变为有一定幅度的圆形.椭圆形等 方法:使用css的border-radius 属性进行设置CSS3 border-radius 属性:向 div 元素添加圆角边框: 一:首先建立一个di ...
- vuejs之路由应用之二
现在我们开始一个应用: 一个应用中包含4个组件,我们暂且可以想象是4个页面,首先是App.vue,App.vue中又包含3个子组件:About.vue,Home.vue,Document.vue Ap ...
- 【LeetCode】TreeNode类实现解析(java实现)
https://blog.csdn.net/styshoo/article/details/52865386 在LeetCode中,TreeNode是经常用到的一个结构体,表示数据结构树(Tree)中 ...
- 【LeetCode】53.最大子序和
最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: ...
- mssql sqlserver 使用SSMS运行sql脚本的六种方法分享
摘要: 下文讲述五种运行sql脚本的方法,如下所示: 实验环境:sql server 2008 R2 在一次会议讨论中,大家咨询我使用SSMS运行sql脚本的方法,下文我将依次举例讲述sql脚本的运行 ...
- ISODATA聚类算法的matlab程序
ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...
- Mybatis环境搭建(二)
1. 创建Maven Project,选择war,修改pom.xml <properties> <!-- JDK版本 --> <java.version>1.8&l ...
- JDOJ3011 铺地板III
JDOJ3011 铺地板III https://neooj.com/oldoj/problem.php?id=3011 题目描述 有3 x N (0 <= N <= 105)的网格,需要用 ...
- guava(三)字符串处理 Joiner Splitter CharMatcher
一.Joiner 拼接字符串 1.join 拼接集合中的元素 System.out.println(Joiner.on(";").join(Ints.asList(1,2,3))) ...