使用WinDbg除錯SQL Server 入門

2021-09-26 05:41:14 字數 2557 閱讀 4034

這篇文章我想**下sql server裡完全不同的領域:如果使用windbg(來自針對windows的除錯工具)除錯sql server。在我們進入枯澀細節之前,我想詳細解釋下為什麼選擇這樣晦澀的話題來寫這篇文章。

在我們進入如何詳細配置windbg對sql serve除錯前,首先我想給你講下sql server裡最重要的dll檔案,在除錯時我們會用到。我們來看下面:

我們知道,sql server本身是在可執行的sqlservr.exe裡實現。在啟動期間,sqlservr.exe會載入多個dll檔案到它的程序空間。從除錯角度來說——下列是重要的幾個dll檔案: )

安裝完成後,在開始選單裡就可以找到這個程式:

當你啟動windbg時,請確認你的賬戶有管理員許可權,不然的話你是不能附加到像sqlservr.exe這樣的程序。為了使用windbg,你需要配置符號表(symbols)。符號表檔案是用來解碼記憶體位址,對應函式名稱,這樣更容易我們除錯和理解。當你使用符號表是,你要區分公共和私有符號表。除了微軟能訪問公共符號,我們只能訪問私有符號。公共符號是私有符號的子集,不包括更有趣的東西,例如:

我是用批處理命令執行windbg,設定正確的符號伺服器位址,直接附加到sqlservr.exe程序。 

首先我們在命令提示符裡切換到windbg所在目錄:

cd c:\program files\debugging tools for windows (x86)

然後使用如下命令:

使用如下的命令:

程式執行現在已經停止了,因為你碰到了ntdll模組裡的斷點。ntdll是系統提供的乙個簡單的封裝dll,用來進行使用者模式到核心模式的轉換。這也意味著現在sql server裡的「每個」執行緒都已經停止了,不能進行任何操作!!!請不要嘗試在生產環境裡將windbg附加到sqlservr.exe!!如果你像恢復sqlservr.exe的執行,按鍵盤上的f5即可——sql server就再次恢復執行了。如果你想再次中斷程式執行,你需要設定sqlservr.exe的程序空間裡的斷點,或者通過鍵盤快捷鍵ctrl+break。

如果你用那個快捷鍵中斷執行,windbg會把你放在sqlservr.exe的某個特定執行緒上。如果你想分析特定記憶體位址或者像設定具體斷點用作進一步的故障排除,推薦你這麼做。在windbg裡乙個非常重要呢個的命令是x命令:它會返回你指定模組裡所有定義的符號。我們來看下面的命令:

x sqlmin!*btree*

這個windbg命令會返回你所有名稱包含「btree」的函式名列表。這樣的話,你就可以在指定的函式名上設定斷點進行分析。返回函式名稱如下格式:

module_name!class_name::function_name

例如sqlmin!btreemgr::seek。如果你像返回btreemgr類定義的所有函式,可以使用下列命令:

x sqlmin!btreemgr::*

x命令是乙個非常強大的命令,用來探索sql server實現的各個類。給你留點家庭作業,回答下列問題:

這篇文章我已經給你介紹了windbg的入門,還有你如何使用這個偵錯程式附加到sql server。你已看到,sqlservr.exe程序空間裡包含多個dll檔案,在那裡每個dll實現了sql server的各個元件功能。當你已經正確配置好公共符號的路徑,你就可以獲得組成sql server的各個類和函式的元資料資訊。這裡windbg的x命令是你的好助手。

希望你會喜歡這個特別的文章,下次我會為你介紹如何使用windbg指令來除錯和執行sql server查詢。

感謝關注!

使用WinDbg核心除錯

看雪學院,笨笨翻譯 使用windbg核心除錯 很有用的資料,由於太長,加上很多,偷懶,留個鏈結在這裡。這裡簡要做一些我測試時候的筆記 首先你要配置好測試環境 參考vmware windgb win7 核心驅動除錯 在你的主機上配置symbols 接著檢查是否已經載入sys.dbg,命令為 kd lm...

使用windbg進行核心除錯

1.因為核心除錯涉及到的是windows系統,所以只能在windows上執行,首先安裝xp虛擬機器 2.然後配置boot.ini檔案,由於boot.ini檔案在xp系統中是被隱藏的,所以需要先取消xp的隱藏資料夾選項,具體步驟 1 開啟的 我的電腦選項 選擇 工具 中的 資料夾選項 2 開啟之後選擇...

Windbg除錯異常

用windbg分析包含異常資訊的dump檔案時,往往當前棧幀已不正確,可通過如下步驟找回 1 teb,找到stackbase和stacklimit 2 通過.cxr命令將異常上下文恢復到相關暫存器 如何找到異常上下文的位址呢?方法一 dds dps dqs stacklimit stackbase ...