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

语法如下:
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:\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
调试SQLSERVER (一)生成dump文件的方法的更多相关文章
- 调试SQLSERVER (一)生成dump文件的方法
http://www.cnblogs.com/lyhabc/p/4184149.html http://www.cnblogs.com/lyhabc/p/4185399.html
- 使用dbghelp生成dump文件以及事后调试分析
前言 在产品的实际应用环境中,如果我们的程序在客户那里出现了问题,例如程序异常了,而这个时候的现象又不能还原或者很难还原重现,那么只有使用dump文件来保存程序的当前运行信息,例如调用堆栈等,同时使用 ...
- 程序自动生成Dump文件
前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...
- 程序自动生成Dump文件()
前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...
- WinDbg抓取程序报错dump文件的方法
程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...
- 如何设置C++崩溃时生成Dump文件
Dump 文件是进程的内存镜像 , 可以把程序的执行状态通过调试器保存到dump文件中 ; Dump 文件是用来给驱动程序编写人员调试驱动程序用的 , 这种文件必须用专用工具软件打开 , 比如使用 W ...
- 获取崩溃时的调用栈和生成dump文件,然后自动重启
首先要说明的是: linux 下 比较方便可以得到 崩溃时的调用栈,win下 比较难办 1. linux 获取调用栈 代码奉上: #include <execinfo.h> //在头 ...
- JVM在遇到OOM(OutOfMemoryError)时生成Dump文件
方法一: 命令:jmap -dump:format=b,file=heap.bin file:保存路径及文件名pid:进程编号(windows通过任务管理器查看,linux通过ps aux查看) du ...
- 如何生成Dump文件
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何生成Dump文件.
随机推荐
- ABAP POPUP函数
POPUP_TO_CONFIRM_LOSS_OF_DATA 弹出一个对话框告知用户有可能丢失数据,询问是否操作继续.POPUP_TO_CONFIRM_STEP 弹出一个对话框询问用户是否操作继续. P ...
- MVC5+EF6 Code First 从零开始——第一章
一直在用Database First 突然感觉关系复杂的时候,生成json经常出现死循环,不够灵活. 今天正好是周五,不太忙就想试试code first吧,试了2次,终于有结果. ok废话不多说,先撸 ...
- mysql在linux下不区分大小写
1.先停止mysql service mysql stop 2.如果用rpm直接安装的mysql,路径在:/usr/下,查找my.cnf. 3.在[mysqld]下添加: lower_case_tab ...
- NC JDK报tools.jar错误(61版本)
添加jdk/lib目录下的tools.jar 然后设置环境变量
- winxp计算机管理中服务详解
winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blo ...
- 使用cookie实现打印浏览记录的功能
可以用cookie知识来实现打印浏览记录.这里面用到的思路是将浏览记录以字符串的方式保存到cookie中,当浏览记录增加时,再将其转化为数组. $uri=$_SERVER['REQUEST_URI'] ...
- java: R文件重复
导入eclipse工程到intellij里面, 然后出现各种错误, xxx.R文件重复, 各种资源id在R文件中找不到, 后来发现是intellij默认将整个项目以及gen文件夹作为源代码目录了, 在 ...
- create()创建的控件不能映射消息函数的解决
有时,使用create()在运行时创建的控件不能将消息映射到父窗口内,此时需要使用消息转发的机制,主要原理:注册一个全局的消息,针对接收消息的控件编写继承类,在该继承类中响应消息,并将已注册的全局消息 ...
- freeCodeCamp:Falsy Bouncer
真假美猴王! 删除数组中的所有假值. 在JavaScript中,假值有false.null.0."".undefined 和 NaN. /*思路 利用布尔值构造filter的测试函 ...
- ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版
MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...