目錄
????????1.前言
????????2.WinDBG中常用的指令
????????3.分析異常時要關注的信息
????????4.心得
前言
????????本篇博客主要針如何使用WinDBG工具調試Dump文件的流程進行一個講解,具體捕獲的Dump文件也是前兩節例子中生成的Dump文件。
WinDBG中常用的指令
? ? ? ? 關于WinDBG調試時常用的指令主要分為以下幾種:
? ? ? ? 1..excr:切換到發生異常的線程上下文中
.excr
? ? ? ? 2.kn:顯示堆棧幀編號和函數地址
kn
圖1.kn指令
? ? ? ? 3.kv:顯示堆棧幀編號,調用閱讀和參數地址
kv
圖2.kv指令
????????4.kp:顯示參數類型和符號化參數值
kp
圖3.kp指令
? ? ? ? 5.lm:查看可執行文件信息,如可執行文件時間戳,動態鏈接庫等信息
lm #輸出可執行文件信息
lm vm openCV* #輸出指定文件的信息
? ? ? ? 6.reload /f:用于強制加載pdb文件。比如當我們導入pdb文件時,使用lm指令發現路徑還是沒有找到,則可以使用該指令
reload /f
? ? ? ? 7..dump:用于WinDBG捕獲到進程異常的時候,指定生成dump文件
.dump /m E:\dmpFile\Wild_Pointer.dmp #生成?小型轉存儲文件
.dump /ma E:\dmpFile\Wild_Pointer.dmp #生成完全轉存儲文件
? ? ? ? 8..cls:清空WinDBG輸出的信息
.cls
? ? ? ? 9.u:輸出指定棧幀的匯編代碼
u ntdll!RtlUserThreadStart+0x2c
圖4.u指令
????????10.r:查看當前線程所有寄存器的值
r
圖5.r指令
????????11.!analyze -v:自動分析崩潰原因
!analyze -v
分析異常時要關注的信息
? ? ? ? 一些還沒有使用過WinDBG分析dump文件的同學可能對一個整體流程有點懵,本小節針對這種情況給了一個作者自己分析的流程,具體如下:
? ? ? ? 1.導入dump文件后,先根據WinDBG的輸出信息分析發送異常的類型
? ? ? ? 2.然后使用kn(kp或者kv都可以)指令分析異常崩潰時的堆棧信息
????????3.根據異常堆棧信息判斷是否存在沒有引用的dll或者pdb文件路徑
????????4.使用lm指令查看沒有引用的模塊的時間戳
? ? ? ? 5.在WinDBG中導入pdb文件和dll文件路徑,并且使用.reload /f強制刷新路徑,保證WinDBG更新路徑信息
? ? ? ? 6.重新使用kn指令查看堆棧信息,如果支持文件跳轉則直接跳轉分析。如果不支持文件跳轉,后續再次發送異常崩潰可以生成完全轉存儲文件,保證捕獲更多信息
? ? ? ? 7.使用u指令指定反匯編棧幀,根據具體的kn輸出的堆棧信息和反匯編的棧幀分析寄存器和匯編代碼
心得
? ? ? ? 在作者本人的使用過程中,也總結了一些比較重要的心得。
? ? ? ? 1.在其他電腦中崩潰后產生的dump文件分析一直鏈接不到符號表路徑,lm輸出的模塊路徑和時間戳和開發電腦的信息不一致,此時可以使用WinDBG綁定進程的方式動態的去生成dmp文件,并且生成的要是完全轉存儲文件
? ? ? ? 2.必要的時候使用u指令反匯編分析棧幀,這樣能在分析異常的時候提供更多信息,尤其是調用的第三方庫
PS:以上就是這個系列的最后一小節,更多的是要去使用WinDBG搭配dump文件分析,由于作者個人在使用過程中更多涉及到隱私,具體的例子無法更好的體現,讀者可以自己多試試,以此形成一個整體的框架,也歡迎各位大牛對該系列的文章進行勘誤!!!萬分感謝!!!