這是本文件的舊版!


Trace BSOD with WinDbg

本篇文章記錄使用WinDbg追蹤BSOD root cause的過程,目的在於透過minidump去找出發生問題的程式碼。而要透過minidump的主要原因,是因為完整的memory deump太大,不易從客戶手中獲得。本篇文章包含:

  1. Launch WinDbg: 使用WinDbg載入並分析minidump。
  2. Setup Symbol Path: 載入Symbol以獲得詳細的callstack內容。
  3. Analyze With Source Code: 找出問題程式碼的位置。

在本文章中,我寫一個測試用的driver叫testdriver當做範例。

Install WinDbg

起初我安裝7600版本的SDK,在Win2012上無法找出正確的root cause,後來改使用Win10 1703版本的SDK。可以直接到微軟網站下載並安裝,只要安裝WinDbg就好。

Fetch MiniDump File

在能夠正常進入系統後或是在安全模式中,將minidump檔案給複製出來,通常位於C:/Winodws/Minidump中:

The first analysis

首先打開從BSOD主機上抓到的minidump:


打開後會看到類似以下畫面,接著點擊!analyze -v或直接在下方kd>中輸入!analyze -v,就會開始分析:


CallStack是debug非常重要的依據,但因為目前沒載入symbol table,無法找到位置所對應的意義:

STACK_TEXT:  
ffffd000`eb981498 fffff801`3b5c389a : 00000000`00000038 00000000`00000000 00000000`00000030 00000000`00000000 : testdriver+0x19fa
ffffd000`eb9814a0 00000000`00000038 : 00000000`00000000 00000000`00000030 00000000`00000000 ffffd000`eb981538 : testdriver+0x189a
ffffd000`eb9814a8 00000000`00000000 : 00000000`00000030 00000000`00000000 ffffd000`eb981538 ffffe000`00000250 : 0x38

為了要讓debug資訊更清楚,我們必須要載入symbol資料。

Setup search path

打開file>symbol search path,並如下圖輸入:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols


完成後會出現載入testdriver.sys錯誤,這是因為缺少testdriver的symbol:

Enable symbol loading diagnostics mode

在kd>中輸入!sym noisy後,可以啟用診斷模式。

Reload symbol

啟用診斷模式後,輸入.reload /i testdriver.sys可以重新讀取symbol:


由上圖可以知道WinDbg到那些地方去載入symbol,所以只要把testdriver.sys放到對應目錄下並重新reload,即可通過這關。但下一關是pdb的問題:


通常build sys出來時,會伴隨著一個pdb,一樣把它放到對應目錄後並重新reload symbol。

The second analysis

在symbol都設定完成後,再次輸入!analyze -v:

如上圖,我們可以知道testdriver清楚的callstack,與呼叫什麼function時發生問題。

Setup Source Search Path

打開file>source search path,並如下圖輸入程式碼目錄:

Third analysis

在設定完Source Search Path後,再次執行分析指令,就能找到問題的對應程式碼:

如何得知driver版本?

如果不知道release時所搭載的驅動版本為何,目前我使用lmt指令去查詢timestamp,再去找對應的driver: