1. 程式人生 > >windbg dump分析入門

windbg dump分析入門

1.符號路徑基本語法:

SRV* 【cache】*toppath

例如:Microsoft公有符號儲存地址:http://msdl.microsoft.com/download/symbols

設定符號路徑就是:SRV*c:\mysymbols*http://msdl.microsoft.com/download/symbols

c:\mysymbols作為符號快取以加快符號的訪問速度

2.檢視已載入的模組和符號檔案基本語法:

lm [option] [-a Address] [-m Pattern] [-M Pattern]


3.重新載入符號基本語法:

.reload  拋棄所有已載入的符號資訊,任何解析符號的動作將從硬碟上重新載入符號檔案

.reload <module>拋棄module的符號資訊,任何解析符號的動作將從硬碟上重新載入符號檔案

.reload /f <module> 強制偵錯程式立刻載入並且解析與模組module相關的符號檔案

.reload nt  載入與當前windows NT核心相對應的符號檔案

.reload /user 當前活躍的程序載入所有的使用者態符號

.reload <module>=start, size通過指定起始地址來強制載入符號

eg:

0:000> .reload /f WS2_32.dll


4.驗證符號基本語法:

!chksym Address

eg:(參考71a20000 71a37000   WS2_32 )

:000> !chksym 71a20011


5.使用符號基本語法:

x [option] module!symbols

例如:

*為萬用字元,在除錯陌生程式碼時很有用

x *!*some*

x module!*


6. 檢視目標系統

vertarget 是version命令的一個功能子集

vertarget顯示除錯目標所在的作業系統版本

version則會顯示除錯環境的其它資訊


7. 檢視暫存器值

r :檢視所有暫存器,如果要在表示式中使用暫存器的值,在暫存器名前加@符號(比如@eax

reax:檢視eax暫存器

8.處理器當前執行程式碼

u . 當前eip指向地址上8條指令

uf  . 當前eip指向地址整個函式

ub . 當前eip指向地址之前8條指令

u .L2之後2條指令

ub .L2之前2條指令

9.檢視當前呼叫棧

k 顯示呼叫棧

kP 5 顯示在呼叫棧中前五個函式以及它們的引數

kb 5 顯示在呼叫棧中五個函式的前三個引數

kf 5 顯示在呼叫棧中五個函式所使用的棧大小

10. 在程式碼中設定斷點

bl:列出所有斷點

bc * : 清除所有斷點

bp module!myclass:memfun:設定斷點

bp+address/符號地址       在address指令處加斷點,但是這個地址所在的模組必須已經被載入

bu+address/符號地址        在address指令處加斷點,但是這個地址所在的模組可以沒有被載入,即延遲載入的模組。

ba: 記憶體訪問斷點,當訪問這個記憶體地址時(一般是資料),程式會斷住。

bl: 列出所有已經載入的斷點和地址

bc: 清理斷點。 bc *,清理所有的斷點。 bc 1,清理1號斷點。

bd: 使一個斷點無效。

be: 使一個斷點有效,與bd左右相反。

反彙編:

ub address/符號 反彙編這個地址之前的語句

u address/符號 反彙編這個地址之後(包括這條語句)的語句

uf address/符號 反彙編整個函式

檢視內容:

dd + address: 將記憶體地址中內容以四位元組為單位顯示出來

da : 將記憶體中內容,以ascii碼的形式顯示出來,主要用於觀察字串

du : 將記憶體中內容以unicode碼形式顯示出來,也用於顯示字串

dv: 不用加記憶體地址,顯示當前棧上面的所有的變數

dt+ 格式 + (address): 把記憶體地址所在的內容,以制定的格式顯示出來,這個格式一般是結構體等。

dds: 把制定地址開始的內容,列出來,如果能對應到程式碼符號,將符號顯示出來。

11. 檢視變數的值

dv顯示區域性變數的值

dv /i顯示值以及儲存位置

dt this 已知符號this指標

dt KBTest 0x1111111 :解析地址0x1111111,型別為KBTest 變數值

12. 檢視記憶體命令

d[type] [AddressRange]

13 綜合分析一個dump檔案:

!analyze -v   :列出堆疊
~0s; .ecxr ; kb :列出暫存器cxr 和呼叫堆疊
kn:給棧列出序號
快捷鍵alt+3: 開啟locals視窗
.frame 05:列出當前棧結構內容

~*kb會顯示所有執行緒的呼叫堆疊。如果堆疊太長,Windbg只會顯示堆疊的一部分。

dt xxx - 顯示出諸如PEB等的資料結構

.lastevent
!analyze
 –v

以上兩行指令都可以顯示 exception 發生時的 exception record 和 stack trace of the function。你也可以使用 .exr, .cxr 和 .ecxr 指令來顯示 exception 和 context records。

14.視窗分析

spy++http://jingyan.baidu.com/article/3a2f7c2e76584a26aed61174.html

15 當EBP和ESP的值已經不可信時,此時無法使用k系列命令來檢視棧回溯,應該通過配合使用“!teb”(得到棧的記憶體位置)和“dds <AddressScope>”(顯示和分析棧記憶體)來手動分析棧回溯(通過排除不是函式的字串行)。

16WinDbg提供dt命令來顯示符號型別資訊(Dump symbolic Type information),有以下三種用法:

(1)“dt [ModuleName]!TypeName”,若省略模組名,則自動查詢所有已載入的模組,如“dt ntdll!*”顯示ntdll裡的所有型別資訊。其中,-b開關指定遞迴的顯示所有子型別的資訊。-r加數字指定遞迴顯示的深度,如-r0表示不顯示子型別資訊。若不想顯示全部欄位,可以使用開關-ny附加欄位過濾搜尋資訊,如“dt _TEB -ny LastError”。

(2)第二種用法是在上一種用法之後加上記憶體地址,按照指定的記憶體地址的內容來顯示具體型別的變數。

(3)第三種用法是顯示型別的例項,如全域性變數、靜態變數和函式。同樣可以列舉函式符號,此時同x命令的功能相似,如“dt dbgee!*wmain*”,若是指定的函式,則會顯示該函式的引數取值和返回值型別。

17 可以使用如下方法搜尋記憶體內容:

(1)“s-[[Flags]]sa|su Range”用來搜尋ASCII(UNICODE)字串,可以用l加整數指定字串的長度。例如“s-[l5] sa (注意這裡sa之前不能有空格)0X600000 0X800000”。

(2)“s-[[Flags]]v Range Object”,在指定記憶體地址範圍內與指定物件相同型別的物件。

(3)“s [-[[Flags]]Type] Range Pattern”,Type決定了匹配搜尋內容的方式,可以為b、w、d、q、a、u,Pattern引數用來指定要搜尋的內容,可以用空格分隔依次搜尋的數值,如:

“s -w -0X400000 l2A000 41 64 76 44 62 67”,要搜尋的內容也可以表示為ASCII碼,如:“s -w 0X400000 l2A000 'A' 'd' 'v' 'D' 'b' 'g'”

(其中l後面跟數字表示在起始地址之後多少範圍內進行搜尋)

54、修改記憶體:

(1)以字串方式編輯:“e{a|u|za|zu} Address "String"”

其中,za|zu代表以0結尾的ASCII(UNICODE)字串。

(2)以數值方式編輯:“e{b|w|d|D|f|p|q} Address Value”,其中,Value引數決定使用者需要修改多少數值。若不鍵入Value,則會進入互動式的修改記憶體介面。

是否顯示所有的資訊都是正確的?


這就是函式,感嘆號前是所屬模組(dll or exe),感嘆號後是函式名+偏移地址。
函式引數是不能直接顯示的,就是顯示出來也不一定對,因為windbg只是依賴暫存器ebp+xx來猜你的函式引數,
而這個推導過程是否正確取決於你的編譯選項,是否選中了幀指標優化等等因素,因為有可能函式引數只是存在了某個暫存器裡而已。

命令

操作

.hh

調出幫助檔案

!help

顯示部分命令

!help <command>

顯示某命令的詳細資訊

lm

顯示程序中載入的模組資訊

lmvm

可以檢視任意一個DLL/EXE的詳細資訊

lml

檢視模組的載入情況

ld

載入某塊

!thread

檢視所有執行緒

~ns

切換到第n號執行緒

!runaway

顯示每一個執行緒所消耗CPU的時間

!sym noisy

開啟WinDbg log日誌,顯示具體資訊

!analyze -v

呼叫WinDbg智慧解析,一般程式崩潰的情況下首選呼叫

!locks

檢視鎖,一般除錯死鎖的情況下使用

~*kb

顯示所有呼叫堆疊

kb

顯示當前呼叫堆疊

dv

顯示區域性變數

dt

顯示資料結構

dd

察看堆內容

!address

顯示某一地址上的頁資訊

u

顯示彙編程式碼

uf

反彙編程式碼

.exr

打印出異常的資訊

.cxr

切換上下文

x

查詢某一符號的地址

dds

把某一地址對應到符號(於x的用法相反)


參考自:

http://blog.csdn.net/chollima/article/details/7704249

http://cuijingbing.blog.163.com/blog/static/46825825201187105423613/

http://blog.csdn.net/agan4014/article/details/2180699