Windbg簡單來說就是一個Windows下對用戶態/內核態的程序進行調試,以及對Core Dump文件的分析。對於Crash,資源泄露,死鎖等問題的分析,Windbg是一個強有力的利器。
生成Dump文件方式
1.1任務管理器
在程序崩潰后,先不關閉程序,在任務管理器中找到該程序對應的進程。右鍵—>創建轉儲文件
此時會在默認的目錄下創建出一個dump文件。
可以看出,此種方法只適用於程序崩潰但沒有立即自行退出的情況。倘若程序故障后自行退出,則此方法就難以應用。不過,我們可以在注冊表中添加如下信息已確保系統在程序崩潰后自行保存一個dump文件:
在注冊表中找到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps
添加項如下圖:
其中DumpType代表的含義是:
0 = Create a custom dump
1 = Mini dump
2 = Full dump
如此一來,一旦程序崩潰,系統會在C:\CrashDump下生成一個dump文件。
1.2WinDbg抓取
程序運行崩潰后,先不關閉程序,將WinDbg附加到改進程上。
執行命令:.dump –ma Test.dmp ,則會產生一個Test.dmp的轉儲文件。
程序中加入存儲Dump的代碼
通過SetUnhandledExceptionFilter設置捕獲dump的入口,然后通過MiniDumpWriteDump生成dump文件。
如下程序在程序異常時會自行轉儲一個名為Test.dmp的dump文件。
https://blog.csdn.net/libaineu2004/article/details/81169061
一、下載
微軟官網提供的Windbg為windows10版本,win7下不能使用。Win7下使用Windbg需要通過Windows SDK下載,下載鏈接為//www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en
安裝
如果對windows SDK的其他內容不感興趣,可只勾選Windbg.
————————————————
開始使用Windbg
微軟官網提供了詳細的使用教程,參考鏈接:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
在使用之前,需要完成以下任務
判斷哪個設備作為服務系統,那個設備作為客戶系統。調試器運行在客戶系統,程序運行在服務系統。
判斷你將要進行用戶態調試還是內核態調試。內核態可以擁有極大的權限,可以訪問系統的任何部分,許多核心操作系統功能和硬件驅動運行在內核態。用戶態擁有很多限制,只能運行在自己的虛擬內存空間,不能直接訪問系統。
關於調試內核態,請參考:
關於調試用戶態,請參考:Getting Started with WinDbg (User-Mode).
除此之外,還需要做以下事情:
配置符號表。為了使用WinDbg提供的所有高級功能,必須加載正確的符號表。可以參考:Symbols for Windows debugging (WinDbg, KD, CDB, NTSD)。Windows 調試中的符號表
配置源碼。如果你的目標是調試你自己的源代碼,你需要配置源碼路徑。
————————————————
https://blog.csdn.net/luchengtao11/article/details/82379374
找不到符號文件
抓取完Dump后,打開WinDbg,Ctrl+D找到剛才抓取的Dump文件,報如下異常:
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
使用Windows符號表服務器
為了方便調試,需要獲取Windows系統DLL的符號表文件。微軟公司提供了可以通過Internet訪問的符號表服務器。
經過設置,在調試過程中,windbg調試器會從符號表服務器自動下載調試所需的PDB文件,非常方便。
設置方法: 在 【Symbol Search Path】 對話框中加入下面的路徑:srv*D:\SystemSymbols*http://msdl.microsoft.com/download/symbols
其中: D:\SystemSymbols為存放符號的下載目錄
意:
win32程序在64位操作系統上,需要生成dump時,應該生成32位的dump,否則windbg在獲取call stack時可能出錯,一些sos、psscor2等擴展無法讀取dump中的數據,一些命令在獲取dump中的信息也會受限。
對於32位dump,應該用x86版的windbg分析(無論是在32位還是64位操作系統上);64位dump,應該用在64位操作系統上使用x64版的windbg進行分析。
分析Dump文件
使用菜單【Open Crash Dump】打開Dump文件,然后打開堆棧觀察窗口,此時看到的堆棧可能不是異常發生時的堆棧。
通過如下命令切換到異常發生時的堆棧:
.ecxr
為了分析異常,可以通過下面的語句來獲取分析信息,幫助定位問題:
!analyze -v
常用命令:
輸入
kv
命令以獲得實際的異常的調用堆棧:
https://www.cnblogs.com/kekec/archive/2012/11/14/2755924.html
https://blog.51cto.com/11512826/2068421
https://www.cnblogs.com/kekec/archive/2012/11/14/2755924.html