Windbg的命令

前面介紹了Windbg的UI功能,也基本上能完成基本的調試任務,可是WinDBG主要是以命令方式工做的,這些命令在Command Window裏輸入。WinDBG共支持三類命令:標準命令、元命令和擴展命令。某些命令僅在實時調試中可用,其餘命令僅在調試轉儲文件時可用。某些命令僅在用戶模式調試期間可用,其餘命令僅在內核模式調試期間可用。只有當目標在某些處理器上運行時,某些命令纔可用。sass

1、標準命令安全

標準命令(standard command)用來提供適用於全部調試目標的基本調試功能.標準命令一般是一兩個字符(version除外)或者符號,只有version等少數命令除外。標準命令的第一個字符是不分大小寫的, 第二個字符可能區分大小寫。全部標準命令都是實如今WinDBG內部的, 執行這些命令時不須要加載任何擴展模塊。迄今爲止, WinDBG調試器共實現了130多條標準命令, 分爲60多個系列. 爲了便於記憶, 能夠根據功能將標準命令概括爲以下18個子類。在命令編輯框中輸入一個問號(?), 能夠顯示出主要的標準命令和每一個命令的簡單介紹。服務器

 

  • 控制調試目標執行
功能 命令 描述/助記 補充信息
恢復運行 g Go ~123g~#g~*g
跟蹤執行 t Trace  
單步執行 p Step  
追蹤監視 wt Trace and Watch Data  
  • 寄存器相關
功能 命令 描述/助記 補充信息
觀察和修改通用寄存器 r Registers  
讀寫MSR寄存器 rdmsr和wrmsr Read MSR and Write MSR  
設置寄存器顯示掩碼 rm Register Mask  
  • IO端口讀寫
功能 命令 描述/助記
讀IO端口 ib, iw, id Input from port (byte, word, double word)
寫IO端口 ob, ow, od Output to port (byte, word, double word)
  • 內存控制
功能 命令 描述/助記 補充信息
觀察內存 d系列 Display Memory d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd
編輯內存 e系列 Enter Values e, ea, eb, ed, eD, ef, ep, eq, eu, ew, eza, ezu
搜索內存 s Search Memory sb, sw, sd, sq, sa, su

         

功能 命令 描述/助記 補充信息
觀察棧 k系列 Display Stack Backtrace k, kb, kc, kd, kp, kP, kv
  • 設置維護斷點
功能 命令 描述/助記
軟件斷點 bp, bu, bm Set Breakpoint, Set Unresolved Breakpoint, Set Symbol Breakpoint
硬件斷點 ba Break on Access
管理斷點 bl Breakpoint List
清除,禁止,從新啓用斷點 bc, bd, be Breakpoint Clear, Breakpoint Disable, Breakpoint Enable
  • 線程
功能 命令 描述/助記
顯示控制線程 ~ Thread Status
  • 進程
功能 命令 描述/助記
顯示進程 | Process Status
  • 表達式
功能 命令 描述/助記
評估表達式 ? Evaluate Expression
評估C++表達式 ?? Evaluate C++ Expression
  • 彙編, 反彙編
功能 命令 描述/助記
彙編 a Assemble
反彙編 u Unassemble
功能 命令 描述/助記
顯示段的選擇子 dg Display Selector: shows the segment descriptor for the specified selector
  • 執行命令文件
功能 命令 描述/助記 補充信息
運行命令腳本文件 $ Run Script File $<, $><,
<,
><, $$>a<
  • 配置命令
功能 命令 描述/助記 補充信息
異常發生或者某事件發生時debuger的處理方式 sx系列 Set Exceptions sx, sxd, sxe, sxi, sxn, sxr, sx-
啓用與禁止靜默模式 sq Set Quiet Mode

sq
sq
{e|d}網絡

設置內核debugging選項 so Set Kernel Debugging Options  
設置符號後綴 ss Set Symbol Suffix ss [a|w|n]

 

  • 版本與系統信息
功能 命令 描述/助記
顯示調試器和調試目標版本 version Show Debugger Version
顯示調試目標所在系統的信息 vertarget Show Target Computer Version

 

  • 檢查符號
功能 命令 描述/助記
檢查符號 x Examine Symbols

 

  • 源程序
功能 命令 描述/助記 補充信息
控制和顯示源程序 ls系列 List Source Lines ls, lsa, lsp, lsc, lsf

 

  • 調試符號
功能 命令 描述/助記
加載調試符號 ld Load Symbols
搜索相鄰符號 ln List Nearest Symbols
顯示模塊列表 lm List Loaded Modules

 

  • 調試會話
功能 命令 描述/助記
結束調試會話 q Quit
結束遠程調試 qq Quit
結束調試會話並分離調試目標 qd Quit and Detach

 2、元命令數據結構

元命令(Meta-Command)用來提供標準命令沒有提供的經常使用調試功能, 與標準命令同樣, 元命令也是內建在調試器引擎或者WinDBG程序文件中的. 全部元命令都已一個點(.)開始, 因此元命令也被稱爲點命令(Dot Command)。app

按照功能, 能夠把元命令分紅以下幾類.ui

  • 顯示和設置調試會話和調試器選項.
    • 用於符號選項的.symopt- Set Symbol Options
    • 用於符號路徑的.sympath- Set Symbol Path, 和.symfix- Set Symbol Store Path.
    • 用於程序源文件的.srcpath- Set Source Path, .srcnoisy- Noisy Source Loading, .srcfix- Use Source Server
    • 用於擴展命令模塊路徑的.extpath- Set Extension Path
    • 用於匹配擴展命令的.extmatch- Display All Matching Extensions
    • 用於可執行文件的.exepath- Set Executable Path
    • 設置反彙編選項的.asm- Change Disassembly Options
    • 控制表達式評估器的.expr- Choose Expression Evaluator
  • 控制調試會話或者調試目標.
    • 從新開始調試會話的.restart- Restart Kernel Connection(Kernel Mode) 或 Restart Target Application(User Mode)
    • 放棄用戶態調試目標(進程)的.abandon- Abandon Process
    • 建立新進程的.create- Create Process
    • 附加到存在進程的.attach- Attach to Process
    • 打開轉儲文件的.opendump- Open Dump File
    • 分離調試目標的.detach- Detach from Process
    • 用於殺掉進程的.kill- Kill Process
  • 管理擴展命令模塊
    • 加載模塊的.load- Load Extension DLL
    • 卸載模塊.unload- Unload Extension DLL和.unloadall- Unload All Extension DLLs
    • 顯示已加載模塊的.chain- List Debugger Extensions
  • 管理調試器日誌文件
    • 顯示信息 .logfile- Display Log File Status
    • 打開 .logopen- Open Log File
    • 追加 .logappend- Append Log File
    • 關閉 .logclose- Close Log File
  • 遠程調試
    • 用於啓動remote.exe服務的.remote- Create Remote.exe Server
    • 用於啓動調試引擎服務器的.server- Create Debugging Server
    • 列出可用服務器的.servers- List Debugging Servers
    • 用於向遠程服務器發送文件的.send_file- Send File
    • 用於結束遠程進程服務器的.endpsrv- End Process Server
    • 用於結束引擎服務器的.endsrv- End Debugging Server
  • 控制調試器
    • 讓調試器睡眠一段時間的.sleep- Pause Debugger
    • 喚醒處於睡眠狀態的調試器的.wake- Wake Debugger
    • 啓動另外一個調試器來調試當前調試器的.dbgdbg- Debug Current Debugger
  • 編寫命令程序
    • 包括一系列相似C語言關鍵字的命令, 如
      • .if, .else, .elsif, .foreach, .do, .while. .continue, .catch, .break, .continue, .leave, .printf, .block. 在<軟件調試>一書第30章的第18節有介紹命令程序的編寫方法.
  • 顯示或者轉儲調試目標數據
    • 產生轉儲文件的.dump- Create Dump File
    • 將原始內存數據寫到文件的.writemem- Write Memory to File
    • 顯示調試會話時間的.time- Display System Time
    • 顯示線程時間的.ttime- Display Thread Times
    • 顯示任務列表的.tlist- List Process IDs
    • 以不一樣格式顯示數字的.formats- Show Number Formats
    • 能夠列出全部元命令和每一個命令的簡單說明的.help- Meta-Command Help

3、擴展命令lua

擴展命令(Extension Command)用於實現針對特定調試目標的調試功能,用於擴展某一方面的調試功能。與標準命令和元命令是內建在WinDBG程序文件中不一樣, 擴展命令式實如今動態加載的擴展模塊(DLL)中的。全部的擴展命令都以!開頭。經過WinDBG的SDK,用戶能夠編寫本身的擴展模塊和擴展命令。執行擴展命令式, 應該以歎號( ! )開始, 歎號在英文中被稱爲bang, 所以擴展名伶也被稱爲Bang Command. 執行擴展命令的完整格式是:![擴展模塊名].<擴展命令名> [參數]。其中, 擴展模塊名能夠省略, 若是省略, WinDBG會自動在已經加載的擴展模塊中搜索指定的命令.spa

WinDBG程序包中包含了經常使用的擴展命令模塊。存放在如下幾個子目錄中:線程

  • WINXP: 調試目標爲Windows XP 或者更高版本時版本時的擴展命令模塊。
  • WINEXT: 適用於全部Windows版本的擴展命令模塊。

擴展模塊

路徑

描述

ext.dll

WINEXT

適用於各類調試目標的經常使用擴展命令

kext.dll

WINEXT

內核態調試時的經常使用擴展命令

uext.dll

WINEXT

用戶態調試時的經常使用擴展命令

logexts.dll

WINEXT

用於監視和記錄API調用(Windows API Logging Extensions)

sos.dll

WINEXT

用於調試託管代碼和.Net程序

ks.dll

WINEXT

用於調試內核流(Kernel Stream)

wdfkd.dll

WINEXT

調試使用WDF(Windows Driver Foundation)編寫的驅動程序

acpikd.dll

WINXP

用於ACPI調試,追蹤調用ASL程序的過程,顯示ACPI對象

exts.dll

WINXP

關於堆(!heap)、進程/線程結構(!teb/!peb)、安全信息(!token、!sid、!acl)和應用程序驗證(!avrf)等的擴展命令

kdexts.dll

WINXP

包含了大量用於內核調試的擴展命令

fltkd.dll

WINXP

用於調試文件系統的過濾驅動程序(FsFilter)

minipkd.dll

WINXP

用於調試AIC78xx小端口(miniport)驅動程序

ndiskd.dll

WINXP

用於調試網絡有關驅動程序

ntsdexts.dll

WINXP

實現了!handle、!locks、!dp、!dreg(顯示註冊表)等命令

rpcexts.dll

WINXP

用於RPC調試

scsikd.dll

WINXP

用於調試SCSI有關的驅動程序

traceprt.dll

WINXP

用於格式化ETW信息

vdmexts.dll

WINXP

調試運行在VDM中的DOS程序和WOW程序

wow64exts.dll

WINXP

調試運行在64位Windows系統中的32位程序

wmitrace.dll

WINXP

顯示WMI追蹤有關的數據結構、緩衝區和日誌文件

 

由於擴展命令是實如今動態加載的擴展模塊(DLL)中的, 因此執行時須要加載對應的擴展模塊. 當調試目標被激活(debuggee activation)時, WinDBG會根據調試目標的類型和當前的工做空間自動加載命令空間中指定的擴展模塊。用戶也可使用一下方法手動加載擴展模塊。

  • 使用.load命令加上擴展模塊的名稱或者完成路徑來加載它. 若是沒有指定路徑, 那麼WinDBG會在擴展模塊搜索路徑(EXTPATH)中尋找這個文件.
  • 使用.loadby命令加上擴展模塊的名稱和一個已經加載的程序模塊的名稱. 這時WinDBG會在指定的程序模塊文件所在目錄中尋找和加載擴展命令模塊. 例如, 在調試託管程序是, 可使用.loadby sos mscorwks命令讓WinDBG在mscorwks模塊所在的目錄中加載SOS擴展模塊, 這樣能夠確保加載正確版本的sos模塊.

當使用"!擴展模塊名.擴展命令名"的方式執行擴展命令時, 若是指定的擴展模塊尚未加載, 那麼WinDBG會自動搜索和加載這個模塊.使用.chain命令能夠列出當前加載的全部擴展模塊, 使用.unload和.unloadall命令能夠卸載指定的或者所有擴展模塊. 大多數擴展模塊都支持help命令來顯示這個模塊的基本信息和所包含的所有命令, 例如執行!ext.help能夠顯示ext模塊中的全部擴展命令。

相關文章
相關標籤/搜索