视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
调试SQLSERVER(一)生成dump文件的方法
2020-11-09 15:37:05 责编:小采
文档


调试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 | 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 Files\Microsoft SQL Server\100\Shared

语法如下:

SqlDumper     

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

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

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

0x01100 – Full Dump(这种dump类型包含整个进程空间,如果是位系统并且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  - Add a comment (not supported in all formats) 添加注释 ,不支持所有格式
/j  - 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:\Temp\sqlexpress_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

下载本文
显示全文
专题