zoukankan      html  css  js  c++  java
  • 调试SQLSERVER (一)生成dump文件的方法

    调试SQLSERVER (一)生成dump文件的方法

    调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置
    调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

    我们知道调试程序主要有两种方法

    第一种是:live debugging (附加进程 使进程hang住) 生产环境最好不要live debugging 

    第二种是:post-mortem debugging or reading dump files (生成dump文件然后进行分析)

    现在介绍一下如何生成dump文件,以及各种方法的差异


    第一步:确定SQLSERVER的进程ID

    由于我的机器安装了四个SQLSERVER实例,所以看到会有四个进程

    方法1:在cmd窗口输入下面命令

    tasklist | find /i "sqlservr"

    方法2:打开任务管理进行查看

    方法3:在SSMS里执行下面sql语句

    SELECT SERVERPROPERTY('PROCESSID') AS sqlpid

    方法4:从SQL errorlog里获取进程ID

    EXEC [sys].[sp_readerrorlog] 


    第二步:生成DUMP文件

    方法1:使用SqlDumper

    最一般的方法就是使用SQLSERVER内部的SqlDumper程序,如果使用默认安装路径default installation path 会是

    C:Program FilesMicrosoft SQL Server100Shared

    语法如下:

    SqlDumper <process id (PID)> <thread id (TID)> <Flags:Minidump Flags> <SQLInfoPtr> <Dump Directory>

    如果对语法不太熟悉,可以使用/? 查看帮助

    一般我们会使用到的flag如下:

    0x0120 – Minidump(只会dump出栈和所加载的模块,是最小的dump类型 ,并且这是sqlserver正常情况下自动生成的dump类型)

    0x01100 – Full Dump(这种dump类型包含整个进程空间,如果是64位系统并且SQLSERVER占用大量内存那么dump出来的文件将会非常大)

    0x8100 – Filtered Dump(Filtered Dump 会dump出 Stolen Memory和buffer pool部分)

    SqlDumper这个工具不但只可以dump出sqlserver,也可以dump出其他软件,进而生成dump文件

    示例:

    Minidump: sqldumper 3116 0 0x0120 0 C:Temp
    Full Dump: sqldumper 3116 0 0x01100 0 C:Temp
    Filtered Dump: sqldumper 3116 0 0x8100 0 C:Temp

     

    SQL进程里当前有45个线程

    生成的minidump文件

    dump文件的命名规则一般是:SQLDmpr####.mdmp

    方法2:使用debugger tools

    例如使用WINDBG或其他debugger工具,将debugger附加到进程(使用PID)里面

    WINDBG的下载地址:http://msdn.microsoft.com/en-us/windows/hardware/hh852365

    下载下来进行安装,当然这时候可以同时下载公有符号包

    下载地址:http://msdn.microsoft.com/zh-cn/windows/hardware/gg463028#Download_windows

    安装好之后,就可以开始菜单看到WINDBG程序,点击他启动

    选择Attach to a Process。。。

     我们附加到进程ID为2168的这个sqlserver进程

    一旦连接上,我们只需要使用.dump命令就能生成dump文件,语法如下:

    Options are: 
    /a - Create dumps for all processes (requires -u)  创建所有进程的dump文件 需要-u 选项
    /b[a] - Package dump in a CAB and delete dump  包装dump文件为CAB格式然后删除dump文件
    /c <comment> - Add a comment (not supported in all formats)  添加注释 ,不支持所有格式
    /j <addr> - Provide a JIT_DEBUG_INFO address  提供一个JIT_DEBUG_INFO地址
    /f - Create a legacy style full dump  创建一个历史full dump
    /m[acdfFhiprRtuw] - Create a minidump (default)  创建一个mini dump文件(默认选项)
    /o - Overwrite any existing file  覆盖任何已经存在的文件
    /u - Append unique identifier to dump name  追加唯一标识符到dump文件名

    “.dump /ma” 命令对于创建一个完整的用户态内存dump文件是合适的

    使用下面命令创建SQLSERVER的mini dump文件放在C:Temp路径下

    .dump /ma C:Tempsqlexpress_pid2168_dump.dmp

    方法3:使用SQLSERVER内置的命令

    在SQLSERVER里面,你可以使用两种方法创建dump文件,第一,使用下面的undocumented命令手工(手工触发)创建

    DBCC STACKDUMP

    这个命令会在SQLSERVER实例安装路径下的LOG文件夹生成dump文件,要生成full dump,mini dump,full-filtered dump需要配合不同的trace flag

    要生成full dump使用下面命令

    --full dump
    DBCC traceon(2544, -1) 
    go
    dbcc traceon(2546, -1) 
    go
    dbcc stackdump
    go
    dbcc TRACEOFF(2544,2546, -1) 
    go

    生成mini dump 使用下面命令

    --mini dump 
    dbcc traceon(2546, -1) 
    go
    
    dbcc stackdump
    GO
    dbcc TRACEOFF(2544,2546, -1) 
    GO

    生成full-filtered dump 使用下面命令

    --full-filtered dump 
    dbcc traceon(2551, -1) 
    go
    
    dbcc stackdump
    GO
    dbcc TRACEOFF(2544,2546,2551, -1) 
    go

    首先看一下你的SQL实例是安装在哪里,打开服务器属性,看到根目录那一栏

    然后执行上面的命令

    full dump

    mini dump

    full-filtered dump

     

    可以看到dump文件的大小都不一样

    另一种方法是使用下面的另一个undocumented命令(SQLSERVER自动触发)创建DUMP文件

    DBCC DUMPTRIGGE

    DBCC DUMPTRIGGER命令会在当有错误发生的时候触发dump的产生,当然你可以指定当发生某种特定错误的时候才触发

    可以使用下面的命令当发生701错误的时候触发 

    -- turn on TFs for full dump 
    DBCC TRACEON(2544, -1) 
    GO 
    DBCC TRACEON(2546, -1) 
    GO
    
    -- set DUMP TRIGGER for exception 701 
    DBCC dumptrigger('set', 701) 
    GO
    
    --exception 701  occur
    BACKUP DATABASE [Temp2] 
    TO 
    DISK ='E:Temp21FULLBACKUP.BAK' ,
    DISK = 'E:Temp22FULLBACKUP.bak',
    DISK = 'E:Temp23FULLBACKUP.bak',
    DISK = 'E:Temp24FULLBACKUP.bak',
    DISK = 'E:Temp25FULLBACKUP.bak',
    DISK = 'E:Temp26FULLBACKUP.bak'
    WITH BUFFERCOUNT=999999999,FORMAT
    --消息 3013,级别 16,状态 1,第 2 行
    --BACKUP DATABASE 正在异常终止。
    --消息 701,级别 17,状态 17,第 2 行
    --资源池 'default' 没有足够的系统内存来运行此查询。
    
    
    -- view exceptions set for DUMP TRIGGER 
    DBCC TRACEON(3604, -1) 
    GO 
    DBCC dumptrigger('display') 
    GO 
    DBCC TRACEOFF(3604, -1) 
    GO
    
    -- Turn off dumptrigger for exception 701 
    DBCC dumptrigger('clear', 701) 
    GO

    这时候在LOG文件夹下就会看到生成的dump文件

    方法4:添加SQLSERVER的启动参数

    –y:启动参数在SQL启动的时候能完成DBCC DUMPTRIGGER命令类似的功能

    For more information refer to:

    http://blogs.msdn.com/psssql/archive/2008/01/10/how-it-works-sql-server-engine-error-messages.aspx

    方法5:在任务管理器里按右键->创建转储文件 

    这个方法不是太推荐,不是太可控

    当点击按钮“创建转储文件”的时候,Windows会创建一个full dump文件

    这个功能只能在Windows 2008 、Windows 2008 R2 、Vista 、 Windows 7上使用

    下篇讲解 使用Windbg调试SQLSERVER的环境设置

    参考文章

    http://blogs.msdn.com/b/askjay/archive/2010/02/05/how-can-i-create-a-dump-of-sql-server.aspx

     

    欢迎大家拍砖o(∩_∩)o 

  • 相关阅读:
    中间代码生成器-5-编译原理
    un-动物:老鼠
    un-动物:狗
    un-动物:猫
    un-动物:鹅
    un-动物:鸭子
    un-动物:鸡
    un-常见动物-动物:马
    un-常见动物-动物:骡
    un-常见动物-动物:牛
  • 原文地址:https://www.cnblogs.com/lyhabc/p/4184149.html
Copyright © 2011-2022 走看看