調試SQLSERVER (三)使用Windbg調試SQLSERVER的一些命令
調試SQLSERVER (一)生成dump文件的方法
調試SQLSERVER (二)使用Windbg調試SQLSERVER的環境設置
windbg命令分為標准命令、元命令、擴展命令
標准命令提供最基本的調試功能,不區分大小寫。如:bp g dt dv k等
元命令提供標准命令沒有提供的功能,也內建在調試引擎中,以.開頭。如.sympath .reload等
擴展命令用於擴展某一方面的調試功能,實現在動態加載的擴展模塊中,以!開頭。如!analyze等
下面我們會直接將debugger 附加到sqlservr.exe 進程
在附加sqlservr之前,我們需要獲得SQLSERVER的PID,在第一篇的時候我們就說過如何獲取SQLSERVER的PID,我們這里就不再敘述了
GO OVER 回顧:調試SQLSERVER (一)生成dump文件的方法
注意:附加debugger 到sqlserver進程會停止SQLSERVER的運行,不要在生產環境上亂試!!
在調試的時候你可以在命令框里輸入一些命令
首先,一個 stack trace很明顯是對應一個線程的,SQLSERVER是一個多線程應用程序,要獲得sqlserver的線程列表,使用命令:~
使用Windbg版本:6.12.0002.633 AMD64
SQL版本:SQL2008R2
操作系統:WIN2008R2
我們附加SQL進程

SQL進程ID是6192

如果要退出,記得輸入q命令,而不要直接關閉窗口,要分離調試而不關閉命令行界面,輸入.detach命令

.detach // 分離調試 .restart // 重啟並調試 .kill // 強制結束當前調試 q // 結束被調試進程,關閉命令行界面,返回到最初的工作空間
附加成功了,我們看到Windbg會加載一些必要的模塊

然后,我們輸入 ~ 命令看一下當前SQL進程的線程列表

進程環境塊(Process Enviroment Block)Peb
線程環境塊(Thread Enviroment Block)Teb
Peb和Teb都是Windows的內核結構體,對於我們來說可以不用深入研究,畢竟我們不是專業的
當然有些可以查看Peb和Teb的命令在本文也不會進行介紹
在調試期間,是沒有辦法連接SQLSERVER的,連接的時候會報錯

並且,如果你當前正在執行SQL語句,也會hang住

再說一次:附加debugger 到sqlserver進程會停止SQLSERVER的運行,不要在生產環境上亂試!!

從上圖中可以看到我們有47個線程 ,線程從0開始計數。

在左邊邊緣的句點指明當前正在上下文中(in context)運行的線程,在提示框中(0:046>)也指明了當前上下文的線程的序數是46
第一列的數字只是給調試器使用的數字序數列

接下來那一列才是進程:線程列,調試器以hex的形式來顯示(pid.tid),比如上面的46 Id: 1830.18a8 Suspend:1
1830的十進制是6192,18a8的十進制是6312
那么 Id: 1830.18a8就表示進程id是6192:線程id是6312
tid:thread id

我們假設有一個查詢正在運行在線程36上面(9e4),我想看一下這個線程的stack trace。
我們可以發出相關命令來查看stack trace,命令是k,k命令可以附帶有多個參數,
例如:
提供函數參數 輸入 kv
提供frame 號碼 輸入 kn
提供內存使用 輸入 kf
我們現在只關注k命令,我們可以對這個線程設置上下文或查看
要設置上下文,可以使用命令 ~36s ,s說明提取線程~36並設置我們的上下文(s)
當我們身處另外一個線程的上下文的時候,如果我們只是需要查看一下這個36線程的 stack trace,我們可以使用命令: ~36k
現在我們設置我們的上下文並獲取我們的stack trace
使用命令:
~36s

然后輸入命令 : k
注意:設置符號路徑的時候,在符號文件夾下面一定要有sqlservr.pdb文件夾,否則當輸入k命令的時候,會得不到函數名

下面是沒有設置正確的符號路徑和設置正確的符號路徑的對比
設置正確,能看到實際的函數名

設置不正確,看不到實際的函數名

大家可以對比一下 ~36s 命令和 k 命令
先用 ~36s 命令切換到36線程的上下文,並顯示出當前36線程所執行的函數

然后用 k 命令進一步顯示36線程的上下文內容,調用層次

比如我們輸入 kf 查看一下各個函數的內存使用也是可以的,顯示內存的單位是byte

輸入 kn 加上frame號碼

好了,回到剛才那里,我們現在在36線程的上下文里,最頂端的函數是“ntdll!NtSignalAndWaitForSingleObject” ,也是正在執行和最后執行的函數
這里其實是一個Windows API將我們的線程帶入等待狀態--等待線程需要的東西准備好的一個信號。
這里的Child-SP(Stack Pointer)和RetAddr(Return Address) ,他們是用於明確棧幀的構造和用於當前函數完成的時候返回執行結果
當我們需要知道當前sqlserver版本的時候,我們可以使用命令 lm
當然,這個命令也是有很多附帶參數的,我們使用下面命令獲得sqlservr模塊的具體信息
lmvm sqlservr

有時候,lm命令對於微軟的技術支持來說是很重要的,因為從這個命令的運行結果可以知道客戶使用的操作系統版本,SQLSERVER版本
SQLSERVER是32位還是64位,是SQL2008還是SQL2008R2
如果輸入 lm 命令, 就可以得到SQLSERVER地址空間里所加載的模塊列表
deferred:表示延遲加載

如果要驗證調試器所加載的目標,我們可以使用管道命令: |

內存命令
我們有時候可能還想把進程的內存內容dump出來,那么我們可以使用 d命令,d命令也一樣有很多的附帶參數,
例如
dc:把提供的地址處內存轉換為ASCII字符數據
dd:只顯示 4字節DWORD格式
內存命令一般用於分析堆空間的內存,或者棧內存里所傳遞的參數數據
我們看一下10號線程的棧情況
** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\ntdll.dll - 0:010> ~10s *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\KERNELBASE.dll - ntdll!NtWaitForSingleObject+0xa: 00000000`774412fa c3 ret 0:010> k Child-SP RetAddr Call Site 00000000`079deb98 000007fe`fd2110dc ntdll!NtWaitForSingleObject+0xa 00000000`079deba0 00000000`00d83b55 KERNELBASE!WaitForSingleObjectEx+0x9c 00000000`079dec40 00000000`00d834ca sqlservr!SOS_Scheduler::SwitchContext+0x26d 00000000`079df0d0 00000000`00d82710 sqlservr!SOS_Scheduler::SuspendNonPreemptive+0xca 00000000`079df110 00000000`00d829bc sqlservr!SOS_Scheduler::Suspend+0x2d 00000000`079df140 00000000`00da2eab sqlservr!EventInternal<Spinlock<154,1,0> >::Wait+0x1a8 00000000`079df190 00000000`01949951 sqlservr!CTraceManagementTask::Invoke+0xbe 00000000`079df1f0 00000000`00d8eb40 sqlservr!CTraceBatchTask::Task+0x1ad 00000000`079df2d0 00000000`00d8f15a sqlservr!SOS_Task::Param::Execute+0x12a 00000000`079df3e0 00000000`00d8ef9f sqlservr!SOS_Scheduler::RunTask+0x96 00000000`079df440 00000000`0135e8ee sqlservr!SOS_Scheduler::ProcessTasks+0x128 00000000`079df4b0 00000000`0135eb25 sqlservr!SchedulerManager::WorkerEntryPoint+0x2d2 00000000`079df590 00000000`00ea7631 sqlservr!SystemThread::RunWorker+0xcc 00000000`079df5d0 00000000`0135f67a sqlservr!SystemThreadDispatcher::ProcessWorker+0x2db *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_88df89932faf0bf6\MSVCR80.dll - 00000000`079df680 00000000`74c437d7 sqlservr!SchedulerManager::ThreadEntryPoint+0x173 00000000`079df720 00000000`74c43894 MSVCR80!endthreadex+0x47 *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\kernel32.dll - 00000000`079df750 00000000`771e59ed MSVCR80!endthreadex+0x104 00000000`079df780 00000000`7741c541 kernel32!BaseThreadInitThunk+0xd 00000000`079df7b0 00000000`00000000 ntdll!RtlUserThreadStart+0x21
0:010> dc 00000000`079df4b0 00000000`079df4b0 00000000 00000000 804aa1a0 00000000 ..........J..... 00000000`079df4c0 fff914a8 000007ff 00000000 00000000 ................ 00000000`079df4d0 8fe8cfb8 00002dec 00000000 00000000 .....-.......... 00000000`079df4e0 032af070 00000000 00000000 00000000 p.*............. 00000000`079df4f0 08d80080 00000000 00000000 00000000 ................ 00000000`079df500 00000001 00000000 fff914a8 000007ff ................ 00000000`079df510 00000006 00000000 fffffffe ffffffff ................ 00000000`079df520 fff914a8 000007ff fff9155c 000007ff ........\....... 0:010> dc 00000000`079df530 804aa1a0 00000000 fff90000 000007ff ..J............. 00000000`079df540 271516fd 00000000 fffffffe ffffffff ...'............ 00000000`079df550 00000003 00000000 fd210000 000007fe ..........!..... 00000000`079df560 8fe8ce78 00002dec 00000000 00000000 x....-.......... 00000000`079df570 804aa1a0 00000000 fff914a8 000007ff ..J............. 00000000`079df580 00000000 00000000 0135eb25 00000000 ........%.5..... 00000000`079df590 804aa1a0 00000000 ab0c671e 00000d5f ..J......g.._... 00000000`079df5a0 ab0c6720 00000d5f ab0c6723 00000d5f g.._...#g.._...
我們首先切到10號線程 (~10s),然后顯示stack (k)。最后我們取出其中一個棧(在stack trace里面的一行),
然后利用Child-SP來dump 出來內存地址,Child-SP在stack-trace里面是一個棧幀的指針---指向棧幀在內存中的起始地址
目前我們只是介紹了在調試里面的一些普通的命令
我們會接着介紹下面命令
vertarget
.chain
!analyze
x
r
u
bp, bl, bc
vertarget命令
查看目標系統的版本信息,可使用下面的vertarget命令,vertarget命令給出在目標機器上的OS版本或者機器運行時間
0:010> vertarget Windows 7 Version 7601 (Service Pack 1) MP (2 procs) Free x64 Product: Server, suite: TerminalServer DataCenter SingleUserTS kernel32.dll version: 6.1.7601.18409 (win7sp1_gdr.140303-2144) Machine Name: Debug session time: Fri Dec 26 12:04:42.159 2014 (UTC + 8:00) System Uptime: 17 days 2:05:00.191 Process Uptime: 0 days 1:37:28.844 Kernel time: 0 days 0:00:00.109 User time: 0 days 0:00:00.437
.chain命令
能夠給出一個擴展命令集的鏈表,大家看到.chain是有.開頭,所以他是元命令
0:010> .chain Extension DLL search Path: C:\Program Files\Debugging Tools for Windows (x64)\WINXP;C:\Program Files\Debugging Tools for Windows (x64)\winext;C:\Program Files\Debugging Tools for Windows (x64)\winext\arcade;C:\Program Files\Debugging Tools for Windows (x64)\pri;C:\Program Files\Debugging Tools for Windows (x64);C:\Program Files\Debugging Tools for Windows (x64)\winext\arcade;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\;C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files\Microsoft Windows Performance Toolkit\ Extension DLL chain: dbghelp: image 6.12.0002.633, API 6.1.6, built Tue Feb 02 04:15:44 2010 [path: C:\Program Files\Debugging Tools for Windows (x64)\dbghelp.dll] ext: image 6.12.0002.633, API 1.0.0, built Tue Feb 02 04:15:46 2010 [path: C:\Program Files\Debugging Tools for Windows (x64)\winext\ext.dll] exts: image 6.12.0002.633, API 1.0.0, built Tue Feb 02 04:15:38 2010 [path: C:\Program Files\Debugging Tools for Windows (x64)\WINXP\exts.dll] uext: image 6.12.0002.633, API 1.0.0, built Tue Feb 02 04:15:36 2010 [path: C:\Program Files\Debugging Tools for Windows (x64)\winext\uext.dll] ntsdexts: image 6.1.7650.0, API 1.0.0, built Tue Feb 02 04:15:18 2010 [path: C:\Program Files\Debugging Tools for Windows (x64)\WINXP\ntsdexts.dll]
最上面兩行顯示了擴展模塊的搜索路徑。
接下來共列出了5個Windbg自帶的擴展模塊:dbghellp、ext、exts、uext和ntsdexts。可以查看到這些擴展模塊的版本信息、鏡像文件路徑。
!analyze -v
詳細顯示當前異常信息,!analyze是一個擴展命令,
此命令分析當前最近的異常事件(如果在進行dump分析,則是bug check),並顯示分析結果
參數
-v:顯示異常的詳細信息,這個選項在調試錯誤的時候最有用。
-f:f是force的縮寫。強制將任何事件都當作異常來分析,即使僅僅是普通的斷點事件。將因此多輸出一些內容。
-hang:在內核環境中,它分析內核鎖和DPC棧;在用戶環境中,它分析線程的調用棧,調試器只會對當前線程進行分析,所以一定要將線程環境切換到最可能引起問題的那個線程中去才有幫助。
0:010> !analyze -v ******************************************************************************* * * * Exception Analysis * * * ******************************************************************************* ***** OS symbols are WRONG. Please fix symbols to do analysis. ************************************************************************* *** *** *** *** *** Your debugger is not using the correct symbols *** *** *** *** In order for this command to work properly, your symbol path *** *** must point to .pdb files that have full type information. *** *** *** *** Certain .pdb files (such as the public OS symbols) do not *** *** contain the required information. Contact the group that *** *** provided you with these symbols if you need this command to *** *** work. *** *** *** *** Type referenced: ntdll!_PEB *** *** *** ************************************************************************* ************************************************************************* *** *** *** *** *** Your debugger is not using the correct symbols *** *** *** *** In order for this command to work properly, your symbol path *** *** must point to .pdb files that have full type information. *** *** *** *** Certain .pdb files (such as the public OS symbols) do not *** *** contain the required information. Contact the group that *** *** provided you with these symbols if you need this command to *** *** work. *** *** *** *** Type referenced: nt!IMAGE_NT_HEADERS32 *** *** *** ************************************************************************* *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\sechost.dll - *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\ole32.dll - *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\RPCRT4.dll - *** ERROR: Module load completed but symbols could not be loaded for C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\Resources\1033\sqlevn70.rll *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\xpstar.dll - GetPageUrlData failed, server returned HTTP status 404 URL requested: http://watson.microsoft.com/StageOne/sqlservr_exe/2009_100_4319_0/53a133d9/ntdll_dll/6_1_7601_18247/521eaf24/80000003/00050590.htm?Retriage=1 FAULTING_IP: ntdll!DbgBreakPoint+0 00000000`77440590 cc int 3 EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000077440590 (ntdll!DbgBreakPoint) ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 1 Parameter[0]: 0000000000000000 FAULTING_THREAD: 0000000000000444 DEFAULT_BUCKET_ID: WRONG_SYMBOLS PROCESS_NAME: sqlservr.exe ADDITIONAL_DEBUG_TEXT: Use '!findthebuild' command to search for the target build information. If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols. MODULE_NAME: ntdll FAULTING_MODULE: 00000000773f0000 ntdll DEBUG_FLR_IMAGE_TIMESTAMP: 521eaf24 ERROR_CODE: (NTSTATUS) 0x80000003 - { EXCEPTION_CODE: (NTSTATUS) 0x80000003 (2147483651) - { EXCEPTION_PARAMETER1: 0000000000000000 MOD_LIST: <ANALYSIS/> PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS LAST_CONTROL_TRANSFER: from 00000000774e7f48 to 0000000077440590 STACK_TEXT: 00000000`0e7ff838 00000000`774e7f48 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!DbgBreakPoint 00000000`0e7ff840 00000000`771e59ed : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!DbgUiRemoteBreakin+0x38 00000000`0e7ff870 00000000`7741c541 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd 00000000`0e7ff8a0 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21 FOLLOWUP_IP: ntdll!DbgBreakPoint+0 00000000`77440590 cc int 3 SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: ntdll!DbgBreakPoint+0 FOLLOWUP_NAME: MachineOwner IMAGE_NAME: ntdll.dll STACK_COMMAND: ~41s ; kb BUCKET_ID: WRONG_SYMBOLS FAILURE_BUCKET_ID: WRONG_SYMBOLS_80000003_ntdll.dll!DbgBreakPoint WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/sqlservr_exe/2009_100_4319_0/53a133d9/ntdll_dll/6_1_7601_18247/521eaf24/80000003/00050590.htm?Retriage=1 Followup: MachineOwner ---------
符號搜索
命令“x”被用來進行符號的全局搜索,你可以把它直接就理解為search
如果什么參數都沒有的話,它將列出當前調試環境下的所有局部變量,前提是要在有局部變量存在的情況下
x [參數] [模塊!符號]
0:010> x sqlservr!SOS_Scheduler::Run* 00000000`00290f10 sqlservr!SOS_Scheduler::RunTask = <no type information>
在SQL Server module (sqlservr)模塊里面搜索所有符號里面包含SOS Scheduler (一個類)的符號
r命令
查看寄存器信息
r //當前線程寄存器信息
~* r // 所有線程寄存器信息
0:010> r rax=0000000002e520d8 rbx=0000000000000000 rcx=0000000003f0dac8 rdx=00000000000001e0 rsi=0000000000000fa0 rdi=000000000000041c rip=00000000774412fa rsp=00000000079deb98 rbp=00000000804aa1a0 r8=00000000000001e0 r9=0000000000000000 r10=0000000000000064 r11=00000000079df190 r12=00000000079debc8 r13=0000000000000000 r14=0000000000000000 r15=0000000008d808f8 iopl=0 nv up ei ng nz na po cy cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000285 ntdll!NtWaitForSingleObject+0xa: 00000000`774412fa c3 ret
CPU上會有一些寄存器,它們是CPU內部用來存放數據的一些小型存儲區域,用來暫時存放參與運算的數據和運算結果的
看一下上面的rax寄存器是一個多用途寄存器一般用來保存返回的值和操作的結果。
“rax”是64位寄存器,而對應32位平台,他的名字叫 “eax”。另外由於是64位CPU所以寄存器的大小也是64位
每一個數字代表4位或 半個字節,因此在寄存器里面存儲的數值兩個數字代表一個字節,下面rax寄存器里面存儲的數就是代表一個64位數( 16 x 4 = 64 bits)
rax=0000000002e520d8
還有一些特別的寄存器,例如rip 和rsp 寄存器
rip寄存器保存了當前的指令指針,他指向下一個要執行的指令
rip寄存器包含一個指向當前棧位置的指針,我們可以使用中括號([])獲取寄存器的實際地址並且里面用匯編代碼顯示出來
0:010> u [rip] ntdll!NtWaitForSingleObject+0xa: 00000000`774412fa c3 ret 00000000`774412fb 0f1f440000 nop dword ptr [rax+rax] ntdll!NtCallbackReturn: 00000000`77441300 4c8bd1 mov r10,rcx 00000000`77441303 b802000000 mov eax,2 00000000`77441308 0f05 syscall 00000000`7744130a c3 ret 00000000`7744130b 0f1f440000 nop dword ptr [rax+rax] ntdll!NtReadFile: 00000000`77441310 4c8bd1 mov r10,rcx
我們看到rip里面指向ntdll!NtWaitForSingleObject,這個函數位於在文章前面線程10的stack trace 的最頂層
u 命令
顯示指定的內存中的程序代碼的反匯編,如果要反匯編某一個地址,直接用u 命令加地址
如果存在符號文件,也可以這樣直接加函數名:
u user32!SendMessagew
當你進行live debug的時候,你可能想在sqlserver運行的時候下斷點,你可以使用符號名或函數起初地址初設置斷點
然后你可以使用條件斷點當某個條件成立的時候觸發中斷
例子
0:010> bp sqlservr!<function or method call>
bp命令
bp: 命令bp是BreakPoint的縮寫。其指令格式如下: bp[ID] [Options] [Address [Passes]] ["CommandString"] 參數Address表示需設置斷點的地址,缺省情況下使用當前指令指針(EIP)的地址。ID是斷點號,一般不手動設置,由調試器內部編號。Passes是一個整數值,即第幾次經過斷點所在代碼時,調試器才需要中斷執行,默認為1,即每次都中斷。CommandString用來設置一組命令,當斷點發生的時候,就執行這一組命令,比如可以把它設置為“k”,這樣斷點處就會輸出當前的調用棧。
斷點相關命令
bl:列出所有斷點 bd:禁止斷點,d代表Disable。如bd 1,禁止斷點1。斷點被禁止后將不起作用,但亦未刪除。 be:恢復斷點,e代表Enable。恢復被禁止的斷點。如be 1恢復1號斷點。 bc:清除斷點,如:bc 1,清除斷點1;bc *,清除全部斷點。 br:序號管理,r代表ReNumber,即重新排序。如:br 2 0,將2號斷點重設為0號斷點。
比如,我想在sqlservr!SOS_Scheduler::RunTask 這個符號上下斷點
首先用x命令列出跟sqlservr!SOS_Scheduler::R*相關的符號名,以保證名字沒有錯誤
0:010> x sqlservr!SOS_Scheduler::R* 00000000`0179c6b0 sqlservr!SOS_Scheduler::RemoveFromCompletedTasks = <no type information> 00000000`0329e200 sqlservr!SOS_Scheduler::RemoveFromPendingQueue = <no type information> 00000000`013458c4 sqlservr!SOS_Scheduler::ResumeBulkInternal = <no type information> 00000000`00d8f0cc sqlservr!SOS_Scheduler::RunTask = <no type information> 00000000`032a4a68 sqlservr!SOS_Scheduler::RetrieveTask = <no type information> 00000000`00d85448 sqlservr!SOS_Scheduler::ResumeBulk = <no type information> 00000000`01345a90 sqlservr!SOS_Scheduler::RunnableQueueInsertBulk = <no type information> 00000000`01344c90 sqlservr!SOS_Scheduler::RemoveFromAbortedQueue = <no type information> 00000000`00d834f8 sqlservr!SOS_Scheduler::Resume = <no type information> 00000000`00d835c4 sqlservr!SOS_Scheduler::RunnableQueueInsert = <no type information>
下斷點
0:010> bp sqlservr!SOS_Scheduler::RunTask
列出所有斷點
0:010> bl 0 e 00000000`00d8f0cc 0001 (0001) 0:**** sqlservr!SOS_Scheduler::RunTask
清除第一個斷點
0:010> bc 1
檢查斷點是否清除了
0:010> bl
最后說一下獲取幫助的命令
? // 打印出所有標准命令
0:010> ? Open debugger.chm for complete debugger documentation B[C|D|E][<bps>] - clear/disable/enable breakpoint(s) BL - list breakpoints BA <access> <size> <addr> - set processor breakpoint BP <address> - set soft breakpoint D[type][<range>] - dump memory DT [-n|y] [[mod!]name] [[-n|y]fields] [address] [-l list] [-a[]|c|i|o|r[#]|v] - dump using type information DV [<name>] - dump local variables E[type] <address> [<values>] - enter memory values G[H|N] [=<address> [<address>...]] - go K <count> - stacktrace KP <count> - stacktrace with source arguments LM[k|l|u|v] - list modules LN <expr> - list nearest symbols P [=<addr>] [<value>] - step over Q - quit R [[<reg> [= <expr>]]] - view or set registers S[<opts>] <range> <values> - search memory SX [{e|d|i|n} [-c "Cmd1"] [-c2 "Cmd2"] [-h] {Exception|Event|*}] - event filter T [=<address>] [<expr>] - trace into U [<range>] - unassemble version - show debuggee and debugger version X [<*|module>!]<*|symbol> - view symbols ? <expr> - display expression ?? <expr> - display C++ expression $< <filename> - take input from a command file
.help // 打印出所有元命令
.hh // 打開windbg的chm幫助文件 彈出幫助文件
windbg> .hh

command /? // 打印命令command具體參數用法
當然Windbg還有非常復雜的玩法,調試SQLSERVER也是很復雜,不是一般初學者可以駕馭
參考文章:
如有不對的地方,歡迎大家拍磚o(∩_∩)o
