[英]How to use WinDbg to analyze the crash dump for VC++ application?
以下是一些可助您順利進行的一般步驟:
首先,您必須更改編譯器的設置,以便它創建 PDB 文件,即使對於發布版本也是如此。 更高版本的Visual C++編譯器默認執行此操作,但在許多版本的 Visual C++ 中,您必須自己執行此操作。 創建程序數據庫文件,然后在每次構建應用程序時保存這些文件的存檔。 應用程序的每個構建都有自己的一組 PDB,這一點至關重要。 例如,您不能僅重用與構建 10 相同的那些來檢查構建 15 生成的轉儲。 在項目的整個生命周期中,您最終會得到大量 PDB,因此請為此做好准備。
接下來,您需要能夠識別生成轉儲文件的應用程序的確切版本。 如果您正在創建自己的 MiniDump(例如通過調用MiniDumpWriteDump() ),可能最簡單的方法是簡單地將 MiniDump 的文件名的一部分作為應用程序的完整版本號。 您需要有一個合理的版本編號方案才能使其工作。 在我的商店中,每次自動構建器創建構建時,我們都會將所有分支的構建號加一。
現在您已經從客戶那里收到轉儲文件,您知道創建轉儲的應用程序的准確版本,並且您已經找到了此構建的 PDB 文件。
現在,您需要查看源代碼管理的歷史記錄並找到該軟件的確切版本的源代碼。 最好的方法是在每次構建時將“標簽”應用於分支。 將標簽的值設置為確切的版本號,在歷史記錄中就變得容易了。
您幾乎已准備好啟動 WinDbg/Visual C++:
c:\\app_build_1.0.100
。現在您有兩種查看轉儲文件的選項。 您可以使用Visual Studio或 WinDbg。 使用 Visual Studio 更容易,但 WinDbg 更強大。 大多數情況下,Visual Studio 中的功能就足夠了。
要使用 Visual Studio,您所要做的就是像打開項目一樣打開轉儲文件。 打開后,“運行”轉儲文件(默認為F5 ),如果所有路徑都設置正確,它將帶您直接進入崩潰的代碼,為您提供調用堆棧等。
要使用 WinDbg,您必須跳過幾個環節:
.symfix
。 這可能需要一些時間,因為它會從 Internet 上下載大量內容。.sympath+ c:\\pdblocation
,用您放置 PDB 文件的任何位置替換路徑名。 確保你在那里得到加號,在.sympath
和+
號之間沒有空格,否則你會搞砸第 3 步。.srcpath c:\\app_build_1.0.100
替換您從源代碼管理中獲取此版本軟件的代碼的路徑。!analyze -v
片刻之后,如果一切配置正確,WinDbg 將帶您到崩潰的位置。 在這一點上你有深挖應用程序的內存空間,關鍵部分,Windows等的狀態萬股期權但是,這遠遠超出了職位的范圍。
祝你好運!
(請參閱下面的“轉儲”部分)
了解工作區的工作原理...
“cmdtree”允許您定義調試器命令的“菜單”,以便輕松訪問常用命令,而無需記住簡潔的命令名稱。
您不必將所有命令定義放入同一個 cmdtree 文本文件中……如果您願意,您可以將它們分開並加載多個(然后它們會獲得自己的窗口)。
您可以在命令行上使用 -c 選項在啟動 WinDBG 時自動運行 WinDBG 腳本。
提供機會打開 DML(調試器標記語言)模式、加載特定擴展、設置 .NET 異常斷點、設置內核標志(例如,在內核調試時您可能需要更改 DbgPrint 掩碼以便您看到跟蹤信息....ed nt !Kd_DEFAULT_Mask 0xffffffff),加載 cmdtrees 等。
一個示例腳本:
$$ Include a directory to search for extensions
$$ (point to a source controlled or UNC common directory so that all developers get access)
.extpath+"c:\svn\DevTools\WinDBG\Extensions"
$$ When debugging a driver written with the Windows Driver Framework/KMDF
$$ load this extension that comes from the WinDDK.
!load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll
!wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf
$$ load some extensions
.load msec.dll
.load byakugan.dll
.load odbgext.dll
.load sosex
.load psscor4
$$ Make commands that support DML (Debugger Markup Language) use it
.prefer_dml 1
.dml_start
$$ Show NTSTATUS codes in hex by default
.enable_long_status 1
$$ Set default extension
.setdll psscor4
$$ Show all loaded extensions
.chain /D
$$ Load some command trees
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt
$$ Show some help for the extensions
!wdfkd.help
!psscor4.help
.help /D
“擴展”允許您擴展 WinDBG 內支持的命令/功能的范圍。
一些博客(本機和托管代碼調試的混合)。
這是一個非常廣泛的問題。
!analyze -v
對其進行基本分析。 您需要為代碼提供可用的符號信息,以使轉儲文件有價值。網站內存轉儲、軟件跟蹤、調試、惡意軟件、受害者軟件和情報分析門戶對我來說非常有用。 我也很喜歡這本書,Mario Hewardt 和 Daniel Pravat 所著的Advanced Windows Debugging 。
Tess Ferrandez 有一套很棒的基礎教程和實驗室,可以幫助您開始使用 Windbg。 我強烈推薦他們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.