1. 程式人生 > >windbg 定位崩潰問題

windbg 定位崩潰問題

sdn cep pdb net 保存 文件 關閉 windows source

技術分享圖片

三板斧如下:

  1. 使用windbg打開dump文件,設置好對應進程的 pdb 文件(這個很關鍵。為了避免releas優化導致符號文件錯亂,我發布的所有 release 版都是關閉代碼優化的)。
  2. 在windbg的"edit"->"open/close log file" 設置log 路徑 “d:\a.log”
  3. 輸入命令 “~*er?$t1=((ntdll!_NT_TIB*)@$teb)->StackLimit;r?$t2=((ntdll!_NT_TIB*)@$teb)->StackBase;!teb;dps@$t1@$t2”

等待完畢,最後打開 d:\a.log ,查找"KiUserExceptionDispatcher", 並記錄下第二個地址xxxxxxxx, 最後 “.cxr xxxxxxxx”,就可以看到異常點了。

技術分享圖片

技術分享圖片

有時候我們會遇到這樣的情況,軟件突然崩潰了,而這時候我還沒開調試器呢,怎麽辦? 比如如下代碼,因為訪問了空指針,等待異常出現後,我們再按照如上方式來分析

int *p = NULL;

int a = *p + 1;

1、異常出現後,找到對應進場,並保存dump

2、查找KiUserExceptionDispatcher

3、切換 .cxr 0010e7e0

一般大家會碰到如下幾個問題:

1、~*er?$t1=((ntdll!_NT_TIB*)@$teb)->StackLimit;r?$t2=((ntdll!_NT_TIB*)@$teb)->StackBase;!teb;dps@$t1@$t2 ,輸入後,會提示“Couldn‘t resolve error at ‘ntdll!_NT_TIB*) .......” : 因為沒有設置windows的符號文件。

2、使用KiUserExceptionDispatcher 找到多處異常地址,需要你一個個切換查看可疑點

3、KiUserExceptionDispatcher找到地址,但是.cxr 沒有切換到奇怪的棧信息, 那麽崩潰可能是由於 踩內存導致(這個需要後面的章節)

4、對於某些棧異常無法捕獲dump,需要設置函數 http://www.cnblogs.com/txk1452/archive/2012/08/11/2634022.html

--------------------- 本文來自 corrupt 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/corrupt/article/details/51352318?utm_source=copy

windbg 定位崩潰問題