差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
cpp:wdm:generic:trace_bsod_with_windbg [2017/07/31 16:48]
tony [Reload symbol]
cpp:wdm:generic:trace_bsod_with_windbg [2023/06/25 09:48] (目前版本)
行 2: 行 2:
 ====== Trace BSOD with WinDbg ====== ====== Trace BSOD with WinDbg ======
 ===== Introduction ===== ===== Introduction =====
-本篇文章記錄使用WinDbg追蹤BSOD root cause的過程,目的在於透過minidump去找出發生問題的程式碼。而要透過minidump的主要原因,是因為完整的memory ​deump太大,不易從客戶手中獲得。本篇文章包含:​+本篇文章記錄使用WinDbg追蹤BSOD root cause的過程,目的在於透過minidump去找出發生問題的程式碼。而要透過minidump的主要原因,是因為完整的memory ​dump太大,不易從客戶手中獲得。本篇文章包含:​
   - Launch WinDbg: 使用WinDbg載入並分析minidump。   - Launch WinDbg: 使用WinDbg載入並分析minidump。
   - Setup Symbol Path: 載入Symbol以獲得詳細的callstack內容。   - Setup Symbol Path: 載入Symbol以獲得詳細的callstack內容。
   - Analyze With Source Code: 找出問題程式碼的位置。   - Analyze With Source Code: 找出問題程式碼的位置。
-在本文章中,我寫一個測試用的driver叫testdriver當做範例。+在本文章中,我寫一個測試用的driver叫testdriver當做範例。在其它章節補充遇到與想到的問題
 ===== Launch WinDbg ===== ===== Launch WinDbg =====
 === Install WinDbg === === Install WinDbg ===
行 18: 行 18:
 \\ \\
 打開後會看到類似以下畫面,接著點擊!analyze -v或直接在下方kd>​中輸入!analyze -v,就會開始分析:​\\ 打開後會看到類似以下畫面,接著點擊!analyze -v或直接在下方kd>​中輸入!analyze -v,就會開始分析:​\\
-{{:​cpp:​wdm:​generic:​windbg_after_open_minidump.png?​800|}}\\+{{:​cpp:​wdm:​generic:​windbg_after_open_minidump.png?​900|}}\\
 \\ \\
 CallStack是debug非常重要的依據,但因為目前沒載入symbol table,無法找到位置所對應的意義:​ CallStack是debug非常重要的依據,但因為目前沒載入symbol table,無法找到位置所對應的意義:​
行 30: 行 30:
 為了要讓debug資訊更清楚,我們必須要載入symbol資料。 為了要讓debug資訊更清楚,我們必須要載入symbol資料。
 ==== Setup search path ==== ==== Setup search path ====
-打開file>​symbol search path,並如下圖輸入:​+打開file>​symbol search path,並如下圖輸入,我把symbols給放在C:​\symbols下:
 <​code>​ <​code>​
 SRV*c:​\symbols*http://​msdl.microsoft.com/​download/​symbols SRV*c:​\symbols*http://​msdl.microsoft.com/​download/​symbols
行 37: 行 37:
 \\ \\
 完成後會出現載入testdriver.sys錯誤,這是因為缺少testdriver的symbol:​\\ 完成後會出現載入testdriver.sys錯誤,這是因為缺少testdriver的symbol:​\\
-{{:​cpp:​wdm:​generic:​windbg_after_reload_symbol_path.png?800|}}+{{:​cpp:​wdm:​generic:​windbg_after_reload_symbol_path.png|}}
 ==== Enable symbol loading diagnostics mode ==== ==== Enable symbol loading diagnostics mode ====
 在kd>​中輸入!sym noisy後,可以啟用診斷模式。 在kd>​中輸入!sym noisy後,可以啟用診斷模式。
 ==== Reload symbol ==== ==== Reload symbol ====
 啟用診斷模式後,輸入.reload /i testdriver.sys可以重新讀取symbol:​\\ 啟用診斷模式後,輸入.reload /i testdriver.sys可以重新讀取symbol:​\\
-{{:​cpp:​wdm:​generic:​windbg_reload_testdriver_sys.png?800|}}\\+{{:​cpp:​wdm:​generic:​windbg_reload_testdriver_sys.png|}}\\
 \\ \\
-由上圖可以知道WinDbg到些地方去載入symbol,所以只要把testdriver.sys放到對應目錄下並重新reload,即可通過這關。但下一關是pdb的問題:​\\ +由上圖可以知道WinDbg到些地方去載入symbol,所以只要把testdriver.sys放到對應目錄下並重新reload,即可通過這關。但下一關是pdb的問題:​\\ 
-{{:​cpp:​wdm:​generic:​windbg_reload_testdriver_pdb.png?800|}}\\+{{:​cpp:​wdm:​generic:​windbg_reload_testdriver_pdb.png|}}\\
 \\ \\
 通常build sys出來時,會伴隨著一個pdb,一樣把它放到對應目錄後並重新reload symbol。 通常build sys出來時,會伴隨著一個pdb,一樣把它放到對應目錄後並重新reload symbol。
行 56: 行 56:
 打開file>​source search path,並如下圖輸入程式碼目錄:​\\ 打開file>​source search path,並如下圖輸入程式碼目錄:​\\
 {{:​cpp:​wdm:​generic:​windbg_source_search_path.png|}} {{:​cpp:​wdm:​generic:​windbg_source_search_path.png|}}
-==== Third analysis ====+==== The third analysis ====
 在設定完Source Search Path後,再次執行分析指令,就能找到問題的對應程式碼:​\\ 在設定完Source Search Path後,再次執行分析指令,就能找到問題的對應程式碼:​\\
-{{:​cpp:​wdm:​generic:​windbg_analyze_with_source_code.png?​700|}}\\+{{:​cpp:​wdm:​generic:​windbg_analyze_with_source_code.png?​900|}}\\ 
 + 
 +===== 其它 ===== 
 +==== 如何得知driver版本?​ ==== 
 +如果不知道release時所搭載的驅動版本為何,目前我使用lmt指令去查詢timestamp,再去找對應的driver:​\\ 
 +{{:​cpp:​wdm:​generic:​windbg_list_driver_timestamp.png|}} 
 +==== 是否一定要載入發生問題的驅動sys與pdb?​ ==== 
 +這個要看發生問題的情況。我另外一隻驅動程式發生的BSOD問題,在只提供系統本身的symbol後,就已經知道問題的發生點:​ 
 +<​code>​ 
 +STACK_TEXT: ​  
 +ffffd001`79154408 fffff800`4d5980e7 : 00000000`00000050 ffffffff`fffffff8 00000000`00000001 ffffd001`791545f0 : nt!KeBugCheckEx 
 +ffffd001`79154410 fffff800`4d47a9c9 : 00000000`00000001 ffffe001`dd3c3880 ffffd001`791545f0 fffff800`4d6a7d33 : nt! ?? ::​FNODOBFM::​`string'​+0x20c37 
 +ffffd001`791544b0 fffff800`4d57122f : 00000000`00000001 ffffffff`ffffffd0 00000000`00001000 ffffd001`791545f0 : nt!MmAccessFault+0x7a9 
 +ffffd001`791545f0 fffff800`4d51eefd : 00000000`00000200 00000000`20206f49 e001e7f2`00000000 ffffe001`e521d210 : nt!KiPageFault+0x12f 
 +ffffd001`79154780 fffff801`72e0136c : 00000000`00000000 00000000`00000801 00000000`00000000 fffff800`4d6f07c8 : nt!IoWriteErrorLogEntry+0x25 
 +ffffd001`791547b0 00000000`00000000 : 00000000`00000801 00000000`00000000 fffff800`4d6f07c8 ffffffff`80000b00 : testdriver2+0x136c 
 +</​code>​ 
 +當然這也和code本身的寫法與問題發生點有關。載入.sys而沒載入.pdb時:​ 
 +<​code>​ 
 +STACK_TEXT: ​  
 +ffffd001`79154408 fffff800`4d5980e7 : 00000000`00000050 ffffffff`fffffff8 00000000`00000001 ffffd001`791545f0 : nt!KeBugCheckEx 
 +ffffd001`79154410 fffff800`4d47a9c9 : 00000000`00000001 ffffe001`dd3c3880 ffffd001`791545f0 fffff800`4d6a7d33 : nt! ?? ::​FNODOBFM::​`string'​+0x20c37 
 +ffffd001`791544b0 fffff800`4d57122f : 00000000`00000001 ffffffff`ffffffd0 00000000`00001000 ffffd001`791545f0 : nt!MmAccessFault+0x7a9 
 +ffffd001`791545f0 fffff800`4d51eefd : 00000000`00000200 00000000`20206f49 e001e7f2`00000000 ffffe001`e521d210 : nt!KiPageFault+0x12f 
 +ffffd001`79154780 fffff801`72e0136c : 00000000`00000000 00000000`00000801 00000000`00000000 fffff800`4d6f07c8 : nt!IoWriteErrorLogEntry+0x25 
 +ffffd001`791547b0 fffff800`4d8d07ea : ffffe001`e7f2de60 00000000`00000000 ffffd001`79154950 ffffe001`e7f2c000 : testdriver2+0x136c 
 +ffffd001`79154850 fffff800`4d8f77ee : ffffe001`dd3c39c0 00000000`00000000 fffff800`4d6b6300 ffffe001`dd3c3880 : nt!IopLoadDriver+0x5e2 
 +ffffd001`79154b10 fffff800`4d466adb : fffff801`00000000 ffffffff`80000b5c fffff800`4d8f77a0 ffffe001`dd5f4ad0 : nt!IopLoadUnloadDriver+0x4e 
 +ffffd001`79154b50 fffff800`4d4e2794 : 4819b200`009206b8 ffffe001`dd3c3880 ffffe001`dd3c3880 ffffe001`dc837040 : nt!ExpWorkerThread+0x293 
 +ffffd001`79154c00 fffff800`4d56d5c6 : fffff800`4d6f9180 ffffe001`dd3c3880 fffff800`4d760a00 41fffec9`1de8cf8b : nt!PspSystemThreadStartup+0x58 
 +ffffd001`79154c60 00000000`00000000 : ffffd001`79155000 ffffd001`7914f000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x16 
 +</​code>​ 
 +==== 是否一定要載入sys對應的pdb?​ ==== 
 +我拿相同版本的程式碼在重新build pdb出來後,雖然reload symbol會出現mismatch,但還是能夠讀到對應的位置:​ 
 +<​code>​ 
 +STACK_TEXT: ​  
 +ffffd001`79154408 fffff800`4d5980e7 : 00000000`00000050 ffffffff`fffffff8 00000000`00000001 ffffd001`791545f0 : nt!KeBugCheckEx 
 +ffffd001`79154410 fffff800`4d47a9c9 : 00000000`00000001 ffffe001`dd3c3880 ffffd001`791545f0 fffff800`4d6a7d33 : nt! ?? ::​FNODOBFM::​`string'​+0x20c37 
 +ffffd001`791544b0 fffff800`4d57122f : 00000000`00000001 ffffffff`ffffffd0 00000000`00001000 ffffd001`791545f0 : nt!MmAccessFault+0x7a9 
 +ffffd001`791545f0 fffff800`4d51eefd : 00000000`00000200 00000000`20206f49 e001e7f2`00000000 ffffe001`e521d210 : nt!KiPageFault+0x12f 
 +ffffd001`79154780 fffff801`72e0136c : 00000000`00000000 00000000`00000801 00000000`00000000 fffff800`4d6f07c8 : nt!IoWriteErrorLogEntry+0x25 
 +ffffd001`791547b0 fffff800`4d8d07ea : ffffe001`e7f2de60 00000000`00000000 ffffd001`79154950 ffffe001`e7f2c000 : testdriver2!gtInitializeDriver+0x364 [c:​\workspace\testdriver2\testdriver2.c @ 684]  
 +ffffd001`79154850 fffff800`4d8f77ee : ffffe001`dd3c39c0 00000000`00000000 fffff800`4d6b6300 ffffe001`dd3c3880 : nt!IopLoadDriver+0x5e2 
 +ffffd001`79154b10 fffff800`4d466adb : fffff801`00000000 ffffffff`80000b5c fffff800`4d8f77a0 ffffe001`dd5f4ad0 : nt!IopLoadUnloadDriver+0x4e 
 +ffffd001`79154b50 fffff800`4d4e2794 : 4819b200`009206b8 ffffe001`dd3c3880 ffffe001`dd3c3880 ffffe001`dc837040 : nt!ExpWorkerThread+0x293 
 +ffffd001`79154c00 fffff800`4d56d5c6 : fffff800`4d6f9180 ffffe001`dd3c3880 fffff800`4d760a00 41fffec9`1de8cf8b : nt!PspSystemThreadStartup+0x58 
 +ffffd001`79154c60 00000000`00000000 : ffffd001`79155000 ffffd001`7914f000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x16 
 +</​code>​ 
 +是否能百試百靈,等以後遇到問題再看看。
  
 ===== Reference ===== ===== Reference =====
行 65: 行 113:
   * [[http://​www.cnblogs.com/​georgepei/​archive/​2012/​02/​15/​2353072.html|symbol加载失败的case分析]]   * [[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://​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]] 
 +  * [[http://​windbg.info/​doc/​1-common-cmds.html|WinDBG commands]] 
 +  * [[https://​www.trusteer.com/​en/​support/​sending-windows-minidump|sending-windows-minidump]] 
 +=====    ===== 
 +---- 
 +\\ 
 +~~DISQUS~~