Maison >base de données >tutoriel mysql >调试SQLSERVER (一)生成dump文件的方法

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

WBOY
WBOYoriginal
2016-06-07 15:26:111856parcourir

调试SQLSERVER (一)生成dump文件的方法 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 我们知道调试程序主要有两种方法 一种是:live debugging (附加进程 使进程hang住) 生产环境最好

调试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 <span>|</span> find <span>/</span>i "sqlservr"

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

 

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

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

 

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

<span>SELECT</span> SERVERPROPERTY(<span>'</span><span>PROCESSID</span><span>'</span>) <span>AS</span> sqlpid

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

 

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

<span>EXEC</span> <span>[</span><span>sys</span><span>]</span>.<span>[</span><span>sp_readerrorlog</span><span>]</span> 

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


第二步:生成DUMP文件

方法1:使用SqlDumper

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

C:\Program Files\Microsoft SQL Server\100\Shared

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

 

 

语法如下:

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

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

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

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

一般我们会使用到的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 <span>3116</span> <span>0</span> <span>0x0120</span> <span>0</span> C:\<span>Temp</span>
<span>Full</span> <span>Dump</span>: sqldumper <span>3116</span> <span>0</span> <span>0x01100</span> <span>0</span> C:\<span>Temp</span><span>
Filtered </span><span>Dump</span>: sqldumper <span>3116</span> <span>0</span> <span>0x8100</span> <span>0</span> C:\<span>Temp</span>

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

SQL进程里当前有45个线程

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

生成的minidump文件

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

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

 

 

方法2:使用debugger tools

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

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

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

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

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

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

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

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

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

选择Attach to a Process。。。

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

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

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

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

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

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

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

.<span>dump</span> <span>/</span>ma C:\<span>Temp</span>\sqlexpress_pid2168_dump.dmp

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

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

 

 

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

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

<span>DBCC</span> STACKDUMP

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

要生成full dump使用下面命令

<span>--</span><span>full dump</span>
<span>DBCC</span> traceon(<span>2544</span>, <span>-</span><span>1</span><span>) 
</span><span>go</span>
<span>dbcc</span> traceon(<span>2546</span>, <span>-</span><span>1</span><span>) 
</span><span>go</span>
<span>dbcc</span><span> stackdump
</span><span>go</span>
<span>dbcc</span> TRACEOFF(<span>2544</span>,<span>2546</span>, <span>-</span><span>1</span><span>) 
</span><span>go</span>

生成mini dump 使用下面命令

<span>--</span><span>mini dump </span>
<span>dbcc</span> traceon(<span>2546</span>, <span>-</span><span>1</span><span>) 
</span><span>go</span>

<span>dbcc</span><span> stackdump
</span><span>GO</span>
<span>dbcc</span> TRACEOFF(<span>2544</span>,<span>2546</span>, <span>-</span><span>1</span><span>) 
</span><span>GO</span>

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

<span>--</span><span>full-filtered dump </span>
<span>dbcc</span> traceon(<span>2551</span>, <span>-</span><span>1</span><span>) 
</span><span>go</span>

<span>dbcc</span><span> stackdump
</span><span>GO</span>
<span>dbcc</span> TRACEOFF(<span>2544</span>,<span>2546</span>,<span>2551</span>, <span>-</span><span>1</span><span>) 
</span><span>go</span>

 

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

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

然后执行上面的命令

full dump

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

mini dump

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

 

full-filtered dump

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

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

 

 

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

<span>DBCC</span> DUMPTRIGGE

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

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

<span>--</span><span> turn on TFs for full dump </span>
<span>DBCC</span> TRACEON(<span>2544</span>, <span>-</span><span>1</span><span>) 
</span><span>GO</span> 
<span>DBCC</span> TRACEON(<span>2546</span>, <span>-</span><span>1</span><span>) 
</span><span>GO</span>

<span>--</span><span> set DUMP TRIGGER for exception 701 </span>
<span>DBCC</span> dumptrigger(<span>'</span><span>set</span><span>'</span>, <span>701</span><span>) 
</span><span>GO</span>

<span>--</span><span>exception 701  occur</span>
<span>BACKUP</span> <span>DATABASE</span> <span>[</span><span>Temp2</span><span>]</span> 
<span>TO</span> 
<span>DISK</span> <span>=</span><span>'</span><span>E:\Temp21FULLBACKUP.BAK</span><span>'</span><span> ,
</span><span>DISK</span> <span>=</span> <span>'</span><span>E:\Temp22FULLBACKUP.bak</span><span>'</span><span>,
</span><span>DISK</span> <span>=</span> <span>'</span><span>E:\Temp23FULLBACKUP.bak</span><span>'</span><span>,
</span><span>DISK</span> <span>=</span> <span>'</span><span>E:\Temp24FULLBACKUP.bak</span><span>'</span><span>,
</span><span>DISK</span> <span>=</span> <span>'</span><span>E:\Temp25FULLBACKUP.bak</span><span>'</span><span>,
</span><span>DISK</span> <span>=</span> <span>'</span><span>E:\Temp26FULLBACKUP.bak</span><span>'</span>
<span>WITH</span> BUFFERCOUNT<span>=</span><span>999999999</span><span>,FORMAT
</span><span>--</span><span>消息 3013,级别 16,状态 1,第 2 行</span><span>
--</span><span>BACKUP DATABASE 正在异常终止。</span><span>
--</span><span>消息 701,级别 17,状态 17,第 2 行</span><span>
--</span><span>资源池 'default' 没有足够的系统内存来运行此查询。</span>


<span>--</span><span> view exceptions set for DUMP TRIGGER </span>
<span>DBCC</span> TRACEON(<span>3604</span>, <span>-</span><span>1</span><span>) 
</span><span>GO</span> 
<span>DBCC</span> dumptrigger(<span>'</span><span>display</span><span>'</span><span>) 
</span><span>GO</span> 
<span>DBCC</span> TRACEOFF(<span>3604</span>, <span>-</span><span>1</span><span>) 
</span><span>GO</span>

<span>--</span><span> Turn off dumptrigger for exception 701 </span>
<span>DBCC</span> dumptrigger(<span>'</span><span>clear</span><span>'</span>, <span>701</span><span>) 
</span><span>GO</span>

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

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

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

 

 

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

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

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

For more information refer to:

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

 

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

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

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

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

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

调试SQLSERVER (一)生成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 

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn