幾個常用的 WinDbg 命令

2021-05-23 08:11:30 字數 4091 閱讀 2254

1. 查詢符號

3. 檢視 event 物件的訊號狀態

!object /basenamedobjects

dt -b nt!_kevent ******xx

4. 檢視 lasterror 值

!gle

5. 指定進製形式,0x/0n/0t/0y 分別表示 16/10/8/2 進製

? 0x12345678+0n10

evaluate expression: 305419906 = 12345682

6. 過濾命令視窗輸出資訊

.prompt_allow -reg +dis -ea -src -sym

7. .formats 命令

以多種格式顯示表示式的值

0:000> .formats @eax

evaluate expression:

hex: 00181eb4

decimal: 1580724

octal: 00006017264

binary: 00000000 00011000 00011110 10110100

chars: ....

time: mon jan 19 15:05:24 1970

float: low 2.21507e-039 high 0

double: 7.80981e-318

8. 異常處理相關

有 sx, sxd, sxe, sxi, sxn, sxr 幾條命令可用來設定異常和事件的處理方式。比如:

0:000> sxe ld

可以在載入 dll 時中斷下來。

9. 核心除錯時切換程序

lkd> !process 0 0

lkd> .process ******xx

10. 可在桌面上建立乙個 windbg.exe 的快捷方式,然後在該快捷方式的屬性力設定如下命令列

c:/windbg/windbg.exe -c ".prompt_allow +dis -reg -ea -src -sym; .enable_unicode 1; .enable_long_status 1; .logopen /t c:/dbglog/dbglog.txt"

11. 本機核心除錯

通過file/kernel debug… 選單可以開啟核心除錯選擇視窗,選擇最後乙個 local 選項頁,確定後可以以核心方式除錯本地機器。這時所有會掛起系統的命令都用不了了,但可以讀寫系統記憶體。另外,有乙個方便的用途是用來檢視系統結構,比如:dt nt!_eprocess。

東方品郎

2007-01-27, 18:08:47

;): 感謝!提供優質服務

lvg

2007-01-27, 20:20:32

windbg 10大除錯命令

u: 反編譯機器碼

在檢查crash dump是否正確時,你已經用過了此命令,u命令有三種格式:

1.u 從位址開始反編譯8個機器碼。

2.u 反編譯到之間的所有機器碼。

3.u 不提供任何引數時,從上次u命令停止的位置開始反編譯。

當然,反編譯打段**是十分厭煩的,但如果你只想知道在特定位址發生的事情,那這是最便捷的方法。或許u命令最令人感興趣的特性是它可以解析**引用到的符號----即使是目標模組沒有匯出的符號。

db,dw和dd:dump memory bytes、words和dwords

如果你當前感興趣的記憶體資料是二進位制的,那麼偵錯程式的16進製制轉儲命令將能完成此任務。根據你對源位址(source address)資料型別的判斷,來選擇dd(針對bytes)、dw(針對words)、dd(針對dwords)。

1.db 將指定記憶體範圍裡的資料顯示為兩個部分:左邊是16進製表示(每2個8 bit一組),右邊是對應的asci碼。

2. dw 僅按照16進製制顯示(16 bit一組)

3. dw 僅按照16進製制顯示(32 bit一組)

此組命令可以使用與u命令相同的引數。注意,所指示的位址內容,也會被顯示出來。如果沒有任何引數,將顯示接下來的128個位元組。

x:檢查符號

x命令非常重要。它可以根據已安裝的符號檔案建立乙個列表。典型的使用方式如下:

1.x *!* 顯示所有可用符號的模組。在啟動後,預設只有ntoskrnl.exe的符號是可用的。其他模組的符號可以使用.reload命令來載入。

2.x !顯示模組的符號檔案中的符號名稱,可以包括萬用字元?和*。必須屬於x *!*列出的模組名。例如,x nt!*將列出在核心符號檔案ntoskrnl.dbg中找到的所有符號,x win32k!*將列出win32k.dbg提供的符號。如果偵錯程式報告說「couldn』t resolv『x….』」,嘗試用.reload再次載入所有的符號檔案。

3.x 顯示所有可用符號的乙個子集,該子集不匹配表示式。本質上,這是x !的乙個變形,在這裡!被省略了。隨符號名一起顯示的,還有與其相關的虛擬位址。對於函式名,與其對應的就是函式的入口位址。對於變數,就是改變量的基位址。該命令值得的注意的地方是,它可以輸出很多內部符號(internal symbols),這些在可執行檔案的匯出表中都是找不到的.

ln:列出最近的符號

1.ln 顯示指示的位址以及和其前後相鄰的位址的符號資訊。

2.ln 將符號名解析為與其對應的虛擬位址。其過程與ln 類似。像x命令一樣,偵錯程式知道所有匯出的以及一些內部的符號。因此,對於想弄清楚出現在反編譯列表或16進製制轉儲中的不明指標的確切含義的人有著非常大的幫助。注意,u、db、dw、dd也會使用符號檔案。

!processfield:列出eprocess的成員

該命令前的!號,意味著它來自於偵錯程式的擴充套件模組―kdextx86.dll。該命令可顯示核心用來代表乙個程序的eprocess結構(該結構並沒有正式的說明文件)的成員及其偏移量。

儘管該命令僅列出了成員的偏移量,但你也能很容易的猜出其正確的型別。例如,lockevent位於0x70處,其下乙個成員的偏移量為0x80。則該成員占用了16個位元組,這與kevent結構非常類似。

!threadfields:列出ethread成員

這是kdextx86.dll提供的另乙個強大的選項。和!processfields類似,它列出未文件化的ethread結構的成員及其偏移量。核心使用它表示乙個執行緒.

!drivers:列出已載入的drivers

kdextx86.dll真是太棒了。!drivers列出了當前執行的核心和檔案系統模組的詳細資訊。如果檢查crash dump,該命令會列出系統崩潰那一刻的系統狀態。示例1-3是我機器上輸出的摘要。注意,在輸出的最後一行,導致windows 2000崩潰的driver的位址為0xbecc2000,這顯然是w2k_kill.sys引發藍屏後顯示的位址。

注:在新的i386kd.exe(ver: 6.3.0017.0)中,!driver命令已不被支援。取而代之的是lm命令。該命令的一般用法是:lm t n

!sel:檢查selector的值

!sel實現於kdextx86.dll。它用來顯示16個連續的memory selector(按位址公升序排列)。你可以反覆的使用此命令直到出現「selector is invalid」。在第4章將討論memory selector,到時我會提供乙個示列**來演示如何在你的程式中crack selectors。

注:在新的偵錯程式中,該命令已不被支援,取而代之的是:dg命令。其一般性用法為:dg.注意末尾的.符號。dg命令最多可列出256個selector。偵錯程式的online help中有詳細說明

windbg中常用的命令

list threads in current process context list detail information of threads in current process context lm list all loaded modules sym noice quiet symbo...

WinDBG常用除錯命令

查詢符號 3.檢視 event 物件的訊號狀態 object basenamedobjects dt b nt kevent xx 4.檢視 lasterror 值 gle 5.指定進製形式,0x 0n 0t 0y 分別表示 16 10 8 2 進製 0x12345678 0n10 evaluate...

WinDBG常用斷點命令

windbg提供了多種設斷點的命令 還bu 可以對還不能識別的符號設定斷點,當系統中有新模組載入進來時,偵錯程式會對未定斷點再次進行識別,如果找到了匹配的符號則會設定它。而bp 斷點會失敗 因為函式位址不存在 bu 斷點則可以成功。新版的windbg中 bp失敗後會自動被轉成bu 以上三個命令是對 ...