調試SQLSERVER (一)產生dump檔案的方法

來源:互聯網
上載者:User

標籤:

調試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:\TempFull Dump: sqldumper 3116 0 0x01100 0 C:\TempFiltered 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 dumpDBCC traceon(2544, -1) godbcc traceon(2546, -1) godbcc stackdumpgodbcc TRACEOFF(2544,2546, -1) go

產生mini dump 使用下面命令

--mini dump dbcc traceon(2546, -1) godbcc stackdumpGOdbcc TRACEOFF(2544,2546, -1) GO

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

--full-filtered dump dbcc traceon(2551, -1) godbcc stackdumpGOdbcc 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  occurBACKUP 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檔案的方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.