調試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
文章列表