在我之前的博文中(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 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。

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排除内存泄漏故障的更多相关文章

  1. UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏

    因为.NET的垃圾回收机制相当完善,通常情况下我们是不需要关心内存泄漏的.问题人一但傻起来,连自己都会害怕,几个页面跳啊跳的,内存蹭蹭的往上涨,拉都拉不住.这种时候我们就需要冷静下来,泡一杯热巧克力. ...

  2. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  3. 用WinDbg分析Debug Diagnostic Tool生成的Userdump文件

    1.下载WinDbg(Debugging Tools for Windows):http://www.microsoft.com/whdc/devtools/debugging/default.msp ...

  4. UWP开发入门(十六)——常见的内存泄漏的原因

    本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...

  5. IIS调试技术之 Debug Diagnostic (调试诊断)

    IIS 调试技术之 Debug Diagnostic (调试诊断) 1      概述 1.1  文档简介 系统出现错误或崩溃,免不了要进行调试.调试能进行的前提是错误能重现,但实际上要重现一个错误有 ...

  6. C++的内存泄漏检测

    C++大量的手动分配.回收内存是存在风险的,也许一个函数中一小块内存泄漏被重复放大之后,最后掏空内存. 这里介绍一种在debug模式下测试内存泄漏的方法. 首先在文件的开头以确定的顺序写下这段代码: ...

  7. VC使用CRT调试功能来检测内存泄漏

    信息来源:csdn     C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...

  8. 上Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题和解决方法

    近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比曾经每天40多w发送量暴增到每天达到200w发送量.由于是採用Java做发送底层,压力递增情况下不可避免的 ...

  9. Windows平台下的内存泄漏检测

    在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏. 在windows平台下内存泄漏检测的原理大致如下. 1. 在分 ...

随机推荐

  1. js监听屏幕方向如何第一次默认不监听

    this.supportOrientation = typeof window.orientation === 'number'; // 检查屏幕方向 checkScreenOrientation() ...

  2. [b0026] python 归纳 (十一)_线程_threading.Thread

    总结: 默认父线程跑完,子线程并不会马上退出,不像 thread.start_threadXXXX 父线程跑完了,并没有退出,一直在那里 线程启动速度很快,不占多少开销,不到1毫 秒 代码: # -* ...

  3. 字符串和id的转换方法

    在项目中经常会遇到一个需求就是字符串和id的转换,比如标签和标签id.因为在存储系统里面存储字符串会比较浪费内存,而存储id会节省内存和提高效率. 问题分解 通过字符串获得id 通过id获得字符串 实 ...

  4. Oracle Merge Into 使用注意事项

    我们操作数据库的时候,有时候会遇到insertOrUpdate这种需求.如果数据库中存在数据就update,如果不存在就insert.Orcale数据库都提供了 MERGE  INTO 方法来处理这种 ...

  5. 在ubuntu15.10上编译arm-linux环境使用的log4c步骤

    步骤: 1.下载log4c源码 2.解压源码包,我解压后的路径是:/home/cc/Downloads/log4c-1.2.4 3.执行以下shell脚本: #!/bin/sh mkdir /home ...

  6. C++ 基础语法 快速复习笔记(3)---重载函数,多态,虚函数

    1.重载运算符和重载函数: C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它 ...

  7. 在execCommand formatBlock 'p'标签里增加class或id或css style?

    <script> function CssFnctn()    {      document.execCommand('formatblock', false, 'p')      va ...

  8. 如何在类中根据枚举值,获取枚举的message的工具类

    枚举类为: public enum OrderStatusEnum implements CondeEnum{ NEW(0, "新订单"), FINISHED(1, "完 ...

  9. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  10. 矩阵快速幂之Kiki & Little Kiki 2

    题意是:给出一串01串,每一秒,每个位置得灯会根据左边那个灯得状态进行改变,(第一个得左边为最后一个)如果左边为1,那么自己就会改变状态,左边为0则不用,问n秒改01串的状态 ///// 首先,我们发 ...