Skip to content
九月 7, 2009 / wychi

WinDBG Step-by-Step Analysis

Setup

當拿到一個crash dump時,第一個要做的動作就是先設定windbg的環境,請參照

WinDbg – Quick Setup

當所有前置動作都準備好了之後,接下來就是先使用一些快速分析的指令,一般來說,會依序執行以下指令

Stage 1

  • k 200

傾印unmanaged的callstack

  • !dumpstack

傾印managed跟unmanaged的callstack

  • !pe -nested

顯示並格式化在所指定位址且衍生自  Exception 類別之任何物件的欄位

注意,這個指令是managed thread only的,且你必需先切換到發生crash的 thread才能得到正確的資訊

明顯的bug在此時應該就可以分析出crash的原因,如果還是看不出頭緒,就請繼續以下的指令

  • !analyze –v

Windbg自動分析,這個指令需要一些時間,會伴隨著大量的資料

Stage 2

如果你需要進入到stage 2,那表示此一bug相當棘手

  • 尋訪所有thread的callstack,尋找關鍵字 KiUserExceptionDispatcher

這個API是OS來用處理exception的API,所有的exception handling都是從這裡開始的,如此即可確認exceptin發生的thread

  • .exr

列出EXCEPTION_RECORD by exception address

.exr -1印出最近一次的EXCEPTION_RECORD

Stage 3

如果你走到這一步驟,那就請多多保重吧..

!DumpStackObjects 印出stack中所有的object,之後在依序檢查object的狀態是否正常
!DumpHeap –type <TYPE> 印出在heap中的所有object
!clrstack -p 列出function的引數
!clrstack –l 列出local變數

WinDbg123

WenYuan Chi

<!–[if supportFields]> TOC \o “1-3″ \h \z \u <![endif]–>WinDbg123. <!–[if supportFields]> PAGEREF _Toc238458153 \h <![endif]–>1<!–[if supportFields]> <![endif]–>

Setup. <!–[if supportFields]> PAGEREF _Toc238458154 \h <![endif]–>1<!–[if supportFields]> <![endif]–>

Stage 1. <!–[if supportFields]> PAGEREF _Toc238458155 \h <![endif]–>1<!–[if supportFields]> <![endif]–>

Stage 2. <!–[if supportFields]> PAGEREF _Toc238458156 \h <![endif]–>2<!–[if supportFields]><![endif]–>

Stage 3. <!–[if supportFields]> PAGEREF _Toc238458157 \h <![endif]–>2<!–[if supportFields]><![endif]–>

<!–[if supportFields]><![endif]–>

Setup

當拿到一個crash dump時,第一個要做的動作就是先設定windbg的環境,請參照

WinDbg – Quick Setup

當所有前置動作都準備好了之後,接下來就是先使用一些快速分析的指令,一般來說,會依序執行以下指令

Stage 1

1. k 200

傾印unmanagedcallstack

2. !dumpstack

傾印managedunmanagedcallstack

3. !pe -nested

顯示並格式化在所指定位址且衍生自 Exception 類別之任何物件的欄位

注意,這個指令是managed thread only的,且你必需先切換到發生crash thread才能得到正確的資訊

明顯的bug在此時應該就可以分析出crash的原因,如果還是看不出頭緒,就請繼續以下的指令

4. !analyze –v

Windbg自動分析,這個指令需要一些時間,會伴隨著大量的資料

Stage 2

如果你需要進入到stage 2,那表示此一bug相當棘手

5. 尋訪所有threadcallstack,尋找關鍵字 KiUserExceptionDispatcher

這個APIOS來用處理exceptionAPI,所有的exception handling都是從這裡開始的,如此即可確認exceptin發生的thread

6. .exr

列出EXCEPTION_RECORD by exception address

.exr -1印出最近一次的EXCEPTION_RECORD

Stage 3

如果你走到這一步驟,那就只能交給上天了

!DumpStackObjects

印出stack中所有的object,之後在依序檢查object的狀態是否正常

!DumpHeap –type <TYPE>

印出在heap中的所有object

!clrstack -p

列出function的引數

!clrstack –l

列出local變數

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: