Heim > Datenbank > MySQL-Tutorial > 调试SQLSERVER (一)生成dump文件的方法

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

WBOY
Freigeben: 2016-06-07 15:26:11
Original
1859 Leute haben es durchsucht

调试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"
Nach dem Login kopieren

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

 

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

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

 

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

<span>SELECT</span> SERVERPROPERTY(<span>'</span><span>PROCESSID</span><span>'</span>) <span>AS</span> sqlpid
Nach dem Login kopieren

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

 

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

<span>EXEC</span> <span>[</span><span>sys</span><span>]</span>.<span>[</span><span>sp_readerrorlog</span><span>]</span> 
Nach dem Login kopieren

调试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>
Nach dem Login kopieren

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

调试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>
Nach dem Login kopieren

 调试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>
Nach dem Login kopieren

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

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

.<span>dump</span> <span>/</span>ma C:\<span>Temp</span>\sqlexpress_pid2168_dump.dmp
Nach dem Login kopieren

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

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

 

 

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

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

<span>DBCC</span> STACKDUMP
Nach dem Login kopieren

这个命令会在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>
Nach dem Login kopieren

生成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>
Nach dem Login kopieren

生成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>
Nach dem Login kopieren

 

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

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

然后执行上面的命令

full dump

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

mini dump

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

 

full-filtered dump

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

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

 

 

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

<span>DBCC</span> DUMPTRIGGE
Nach dem Login kopieren

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>
Nach dem Login kopieren

这时候在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 

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage