本文為 Dennis Gao 原創技術文章,發表于博客園博客,未經作者本人允許禁止任何形式的轉載。
系列博文
《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 顯示有效作用的機器信息 .effmach . .effmach # .effmach x86 | amd64 | ia64 | ebc
.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] 指定模塊的包含或屏蔽列表
參考資料
本文為 Dennis Gao 原創技術文章,發表于博客園博客,未經作者本人允許禁止任何形式的轉載。
系列博文
《WinDbg 命令三部曲:(一)WinDbg 命令手冊》
《WinDbg 命令三部曲:(二)WinDbg SOS 擴展命令手冊》
《WinDbg 命令三部曲:(三)WinDbg SOSEX 擴展命令手冊》