差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

cpp:wdm:generic:trace_bsod_with_windbg [2017/08/01 11:39]
tony [Introduction]
cpp:wdm:generic:trace_bsod_with_windbg [2023/06/25 09:48]
行 1: 行 1:
-{{tag>​WDM}} +
-====== Trace BSOD with WinDbg ====== +
-===== Introduction ===== +
-本篇文章記錄使用WinDbg追蹤BSOD root cause的過程,目的在於透過minidump去找出發生問題的程式碼。而要透過minidump的主要原因,是因為完整的memory deump太大,不易從客戶手中獲得。本篇文章包含:​ +
-  - Launch WinDbg: 使用WinDbg載入並分析minidump。 +
-  - Setup Symbol Path: 載入Symbol以獲得詳細的callstack內容。 +
-  - Analyze With Source Code: 找出問題程式碼的位置。 +
-在本文章中,我寫一個測試用的driver叫testdriver當做範例。在其它章節補充遇到與想到的問題。 +
-===== Launch WinDbg ===== +
-=== Install WinDbg === +
-起初我安裝7600版本的SDK,在Win2012上無法找出正確的root cause,後來改使用Win10 1703版本的SDK。可以直接到[[https://​developer.microsoft.com/​zh-tw/​windows/​hardware/​windows-driver-kit|微軟網站]]下載並安裝,只要安裝WinDbg就好。 +
-=== Fetch MiniDump File === +
-在能夠正常進入系統後或是在安全模式中,將minidump檔案給複製出來,通常位於C:/​Winodws/​Minidump中:​\\ +
-{{:​cpp:​wdm:​generic:​minidump_file.png|}} +
-=== The first analysis === +
-首先打開從BSOD主機上抓到的minidump:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_open_minidump.png|}}\\ +
-\\ +
-打開後會看到類似以下畫面,接著點擊!analyze -v或直接在下方kd>​中輸入!analyze -v,就會開始分析:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_after_open_minidump.png?​800|}}\\ +
-\\ +
-CallStack是debug非常重要的依據,但因為目前沒載入symbol table,無法找到位置所對應的意義:​ +
-<​code>​ +
-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 +
-</​code>​ +
-===== Setup Symbol Path ===== +
-為了要讓debug資訊更清楚,我們必須要載入symbol資料。 +
-==== Setup search path ==== +
-打開file>​symbol search path,並如下圖輸入,我把symbols給放在C:​\symbols下:​ +
-<​code>​ +
-SRV*c:​\symbols*http://​msdl.microsoft.com/​download/​symbols +
-</​code>​ +
-{{:​cpp:​wdm:​generic:​windbg_setup_reload_symbol_path.png|}}\\ +
-\\ +
-完成後會出現載入testdriver.sys錯誤,這是因為缺少testdriver的symbol:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_after_reload_symbol_path.png?​800|}} +
-==== Enable symbol loading diagnostics mode ==== +
-在kd>​中輸入!sym noisy後,可以啟用診斷模式。 +
-==== Reload symbol ==== +
-啟用診斷模式後,輸入.reload /i testdriver.sys可以重新讀取symbol:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_reload_testdriver_sys.png?​800|}}\\ +
-\\ +
-由上圖可以知道WinDbg到那些地方去載入symbol,所以只要把testdriver.sys放到對應目錄下並重新reload,即可通過這關。但下一關是pdb的問題:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_reload_testdriver_pdb.png?​800|}}\\ +
-\\ +
-通常build sys出來時,會伴隨著一個pdb,一樣把它放到對應目錄後並重新reload symbol。 +
-==== The second analysis ==== +
-在symbol都設定完成後,再次輸入!analyze -v:\\ +
-{{:​cpp:​wdm:​generic:​windbg_after_load_pdb.png|}}\\ +
-如上圖,我們可以知道testdriver清楚的callstack,與呼叫什麼function時發生問題。 +
-===== Analyze With Source Code ===== +
-==== Setup Source Search Path ==== +
-打開file>​source search path,並如下圖輸入程式碼目錄:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_source_search_path.png|}} +
-==== The third analysis ==== +
-在設定完Source Search Path後,再次執行分析指令,就能找到問題的對應程式碼:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_analyze_with_source_code.png?​800|}}\\ +
-===== 其它 ===== +
-==== 如何得知driver版本?​ ==== +
-如果不知道release時所搭載的驅動版本為何,目前我使用lmt指令去查詢timestamp,再去找對應的driver:​\\ +
-{{:​cpp:​wdm:​generic:​windbg_list_driver_timestamp.png|}} +
-===== Reference ===== +
-  * [[http://​geekswithblogs.net/​.netonmymind/​archive/​2006/​03/​14/​72262.aspx|WinDbg / SOS Cheat Sheet]] +
-  * [[https://​blogs.msdn.microsoft.com/​cclayton/​2010/​02/​24/​how-to-setup-windbg/​|how-to-setup-windbg?​]] +
-  * [[http://​www.cnblogs.com/​georgepei/​archive/​2012/​02/​15/​2353072.html|symbol加载失败的case分析]] +
-  * [[https://​blogs.technet.microsoft.com/​askcore/​2008/​10/​31/​how-to-debug-kernel-mode-blue-screen-crashes-for-beginners/​|How to Debug Kernel Mode Blue Screen Crashes (for beginners)?​]] +
-  * [[https://​docs.microsoft.com/​en-us/​windows-hardware/​drivers/​debugger/​verifying-symbols|Verifying symbols]] +
-=====    ===== +
----- +
-\\ +
-~~DISQUS~~+