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