- 《WinDbg 命令三部曲:(一)WinDbg 命令手冊》
- 《WinDbg 命令三部曲:(二)WinDbg SOS 擴展命令手冊》
- 《WinDbg 命令三部曲:(三)WinDbg SOSEX 擴展命令手冊》
導航目錄
- 內置幫助命令
- 調試會話命令
- 一般信息命令
- 符號加載命令
- 模塊加載命令
- 異常分析命令
- 進程信息命令
- 線程信息命令
- 堆棧信息命令
- 擴展幫助命令
- 日志擴展命令
調試準備
為了測試 WinDbg 中使用 SOS 擴展命令,我創建了應用程序 "MemoryLeakApp.exe",Visual Studio?程序選擇為 64 位環境編譯。
?"MemoryLeakApp.exe"?啟動運行后可能占用內存600M。
此時,選擇使用 64 位 WinDbg 來調試程序。我們先通過 Attach Process 方式來調試。
當然,如果我們使用了 32 位的 WinDbg 去 Attach 進程,會直接報錯。
?
WinDbg 常用命令手冊
內置幫助命令命令 | 描述 |
? | ? ? ? ? ? ? 顯示常規命令 ? /D ? ? ? ? ? ?通過 DML(Debugging Markup Language) 方式顯示常規命令 |
.help | .help ? ? ?顯示 . 系列命令 .help /D ? ? ??通過 DML 方式顯示 . 系列命令 .help /D a* ??通過 DML 方式顯示所有以 'a' 字母開頭的 . 系列命令 |
.chain | .chain ? ? ? ? ?列出所有已加載的調試器擴展 .chain /D ? ? ?通過 DML 方式列出所有已加載的調試器擴展 |
.extmatch | .extmatch /e ExtDLL FunctionFilter ? ? ?顯示調試器擴展的所有導出函數 .extmatch /D /e ExtDLL FunctionFilter ?通過 DML 方式顯示調試器擴展所有導出函數 .extmatch /D /e uext * ? ? ? ? ? ? ? ? ? ? ? 顯示 uext 擴展中的所有導出函數 |
.hh | .hh ? ? ? ? 打開 WinDbg 的幫助文件 .hh Text ?打開 WinDbg 的幫助文件,并自動搜索 Text 的內容 .hh dt ? ? 在 WinDbg 幫助文件中搜索 dt 命令 |
命令 | 描述 |
.attach | .attach PID 附加到指定ID的進程 |
.detach | .detach ? ? ?結束調試會話,被調試進程仍可繼續運行 |
q | q ? ? ? ? ? ? ? 結束調試會話,同時終止被調試進程的進行 qq ? ? ? ? ? ??結束調試會話,同時終止被調試進程的進行 |
.restart | .restart ? ? ?重啟被調試應用 |
命令 | 描述 |
version | 顯示調試器版本信息和已加載的調試器擴展 |
vercommand | 顯示調試器啟動文件的路徑 |
vertarget | 顯示目標機器的版本 |
CTRL+ALT+V | 打開或關閉 Verbose 模式開關,某些命令在此模式下可以給出更多詳細信息 |
.formats | .formats Expression ?顯示數字的各種格式信息 .formats 5 |
.cls | 清理屏幕 |
.last event | 顯示最新的異常信息或事件信息 |
.effmach | .effmach 顯示有效作用的機器信息 |
.time | 顯示系統記錄的各種時間 |
.echo | .echo String ?輸出字符串 .echo "String" .echo "Hello World" |
命令 | 描述 |
ld | ld ModuleName ?加載指定模塊的符號 ld * ? ? ? ? ? ? ? ? ?加載所有模塊的符號 |
!sym | !sym ? ? ? ? ? ? ? ?獲取符號加載狀態 !sym noisy ? ? ? 讓調試器顯示符號搜索詳細信息 !sym quiet ? ? ? ?默認項,不顯示符號搜索信息 |
.sympath | .sympath ? ? ? ? 顯示和設置符號搜索路徑 .sympath+ ? ? ? 增加符號搜索路徑 .sympath+ C:\Symbols |
.symopt | .symopt ? ? ? ? ? ?顯示當前符號可選項 .symopt+ Flags ?添加符號可選項 .symopt- Flags ? 移除符號可選項 |
.symfix | .symfix ? ? ? ? ? ? ? ? ? ? ? ? ? 設置符號庫路徑 .sym+ DownstreamStore ?添加符號庫路徑 |
x | x [Options] Module!Symbol ? ?模式匹配符號信息 x /t .. ? ? ? ? ? ?根據數據類型匹配 x /v .. ? ? ? ? ? ?顯示詳細信息 x /a .. ? ? ? ? ? ?按照地址排序 x /n .. ? ? ? ? ? ?按照名稱排序 x /z .. ? ? ? ? ? ?按照大小排序 x *! ? ? ? ? ? ? ? 列出所有模塊 x ntdll!* ? ? ? ? ?列出 ntdll 模塊 x /t /v ntdll!* ? ?列出 ntdll 模塊數據類型和符號類型 |
.reload | .reload ? ? ? ? ? ? ? ? ? ? ? ? ? ?重新加載符號信息 .reload [/f | /v] ? ? ? ? ? ? ? ?/f 強制立即加載符號 /v 顯示詳細信息 .reload [/f | /v]?Module?? ? Module 為指定模塊加載符號信息 .reload /f @"ntdll.dll" .reload /f @"C:\WINNT\System32\verifier.dll" |
命令 | 描述 |
?lm | lm[ v | l | k | u | f ] [m Pattern] 顯示已加載的模塊 lm ? 顯示所有加載和未加載的模塊信息 lmv 顯示已加載模塊的詳細信息 lml ?同時顯示加載的符號信息 lmk 顯示內核模塊信息 lmu 顯示用戶模塊信息 lmf ?顯示鏡像路徑 lmm 匹配模塊名稱 lmD 使用 DML 方式顯示 lmv m kernel32 顯示 kernel32 模塊詳細信息 |
!dlls | !dlls ? ? ? ? 列出所有加載的模塊和加載數量 !dlls -i ? ? ?根據初始化順序 !dlls -l ? ? ?根據加載順序(默認項) !dlls -m ? ?根據內存順序 !dlls -v ? ? 顯示更多詳細信息 !dlls -c?ModuleAddr ?僅顯示 ModuleAddr 地址的模塊信息 !dlls -? ? ? 顯示幫助 !dlls -v -c kernel32 顯示 kernel32.dll 的信息 |
!lmi | !lmi?Module ? ?顯示模塊的詳細信息,包括加載符號信息 !lmi kernel32 ?顯示 kernel32.dll 模塊的信息 |
命令 | 描述 |
!analyze | !analyze -v ? ? ? 顯示當前異常的詳細信息 !analyze -hang ?診斷線程調用棧上是否有任何線程阻塞了其他線程 !analyze -f ? ? ? ?查看異常分析信息,盡管調試器并未診斷出異常 |
命令 | 描述 |
!dml_proc | 通過 DML 方式顯示當前進程的信息 |
.tlist | 顯示當前所有進程 |
命令 | 描述 |
~ | ~ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?顯示線程信息 ~* [Command] ? ? ? ? ? 所有線程 ~. [Command] ? ? ? ? ? ?當前線程 ~# [Command] ? ? ? ? ? 引發當前事件或異常的線程 ~Number [Command] ?顯示指定序號的線程 ~~[TID] [Command] ? 顯示指定線程ID的線程 ~Ns ? ? ? ? ? ? ? ? ? ? ? ? ?切換到線程 N ~* k ?顯示所有線程的調用棧 ~2 f ? 凍結2號線程 ~# f ?凍結引發異常的線程 ~3 u ?解除對3號線程的凍結 ~2 k ?顯示2號線程的調用棧 |
~e | ~* e CommandString ? ? ? ? ? ?在所有線程上執行命令 ~. e CommandString ? ? ? ? ? ? 在當前線程上執行命令 ~# e CommandString ? ? ? ? ? ?在引發異常的線程上執行命令 ~Number e CommandString ? 在指定序號的線程上執行命令 ~2e r; k; kd ?相當于 ~2r; ~2k; ~2kd ~*e !gle ? ? ? 顯示所有線程的最后一個錯誤信息 |
~f | ~Thread f ? ?凍結線程 |
~u | ~Thread u ? 解除凍結線程 |
~n | ~Thread n ? 掛起線程,增加線程掛起數量 |
~m | ~Thread m ?恢復線程,減少線程掛起數量 |
!teb | 顯示線程環境信息 |
!tls? | !tls -1 ? ? ? ? ?-1 為顯示當前線程所有的 slot 信息 !tls SlotIdx ? 顯示指定的 slot 信息 !tls [-1 | SlotIdx] TebAddr |
.ttime | 顯示線程時間信息 |
!runaway | [Flags: 0 | 1 | 2] 顯示每個線程消耗的時間,用于快速的查找 CPU 時間消耗最多的線程 0 用戶態時間 1 內核態時間 2 自線程創建起的時間間隔 |
!gle | !gle ? ? ? ? 顯示當前線程的最后錯誤 !gle -all ? ?顯示所有線程的最后錯誤 |
!error | !error ErrValue ? ? ?解析錯誤信息 !error ErrValue 1 ? 將錯誤值作為 NTSTATUS 代碼 |
命令 | 描述 |
k | k [n] [f] [L] [#Frames] ?顯示調用棧信息 kn ? ? ?調用棧包含幀號 kf ? ? ? 臨近幀的距離 kL ? ? ? 忽略源代碼 kb ... ?最開始的 3 參數 kp ... ?所有的參數,包括參數類型、名稱和值 kP ... ?所有的參數 kv ... ?FPO信息 kb 5 ? 顯示最開始的 5 個幀 |
kd | kd [WordCnt] ?顯示原始棧數據和可能的符號信息 |
kM | 使用 DML 格式顯示堆棧信息 |
.kframes | 設置棧長度,默認是20(0x14) |
.frame | .frame ? ? ? ? ? ?顯示當前幀 .frame # ? ? ? ? 指定幀號 .frame /r [#] ? 顯示寄存器信息 .frame 2 ? ? ? ? 顯示幀號 2 的信息 .frame /r 0d ? ?顯示 0 幀中寄存器信息 |
!uniqstack | !uniqstack?? ? ? ? ? ? ? ? ? 顯示所有線程的棧信息 !uniqstack [b|v|p] [n] ? b=前3個參數;v=FPO信息;p=所有參數;n=幀號 !uniqstack -? ? ? ? ? ? ? ? 顯示幫助 |
!findstack | !findstack Symbol ? ? ? ? ? ? ?找到包含符號或模塊的棧 !findstack Symbol [0|1|2] ? 0=僅顯示線程ID;1=線程ID和幀;2=全部的線程棧; !findstack -? ? ? ? ? ? ? ? ? ? ? ?顯示幫助 !findstack clr 2 ? ? ? ? ? ? ? ? ? 顯示包含 clr 的所有棧的信息 |
命令 | 描述 |
!Ext.help | 常規擴展命令幫助 |
!Exts.help | ?![]() |
!Uext.help | 用戶態模式擴展命令幫助 |
!Ntsdexts.help | 用戶態擴展命令幫助(OS相關) |
!logexts.help | 日志相關擴展 |
!clr10\sos.help | 調試托管代碼 |
!wow64exts.help | wow64調試器擴展 |
!Wdfkd.help | 內核態驅動框架擴展 |
!Gdikdx.help | 圖形驅動擴展 |
!NAME.help | 顯示任何 NAME 名稱的擴展命令的幫助 |
命令 | 描述 |
!logexts.help | ?顯示所有日志擴展命令 |
!loge | !loge [dir] ?打開日志功能,可選配置輸出目錄 |
!logi | 初始化日志功能 |
!logd | 關閉日志功能 |
!logo | !logo ? ? ? ? ? ? ? ? ? ?列出日志配置信息 !logo [e|d] [d|t|v] ?打開或關閉日志,d=調試器,t=文本文件,v=詳細信息 |
!logc | !logc ? ? ? ? ? ? ? ? ? ? ? ?列出所有日志類型 !logc p # ? ? ? ? ? ? ? ? ?列出 # 中的日志類型 !logc [e|d] * ? ? ? ? ? ? ?打開或關閉所有日志類型 !logc [e|d] # [#] [#] ?打開或關閉日志類型 # |
!logb | !logb p ?打印緩沖區信息至調試器 !logb f ? 刷新緩沖區內容之日志文件 |
!logm | !logm ? ? ? ? ? ? ? ? ? ? ? ? ?顯示模塊的包含或屏蔽列表 !logm [i|x] [DLL] [DLL] ?指定模塊的包含或屏蔽列表 |
參考資料
- Common WinDbg Commands
- WinDbg cheat sheet
- Debugger Commands
- Command Tokens
- Meta-Commands
- Command-Line Options
- 那些年黑了你的微軟BUG
- WinDbg - Kernel-Mode Extension Commands
- WinDbg - General Extension Commands
- WinDbg - Meta-Commands
- WinDbg - Commands
- WinDbg - Command Tokens
- Debugger Commands from MSDN