簡體   English   中英

如何使用 WinDbg 分析 VC++ 應用程序的故障轉儲?

[英]How to use WinDbg to analyze the crash dump for VC++ application?

如何使用WinDbg分析轉儲文件?

以下是一些可助您順利進行的一般步驟:

首先,您必須更改編譯器的設置,以便它創建 PDB 文件,即使對於發布版本也是如此。 更高版本的Visual C++編譯器默認執行此操作,但在許多版本的 Visual C++ 中,您必須自己執行此操作。 創建程序數據庫文件,然后在每次構建應用程序時保存這些文件的存檔。 應用程序的每個構建都有自己的一組 PDB,這一點至關重要。 例如,您不能僅重用與構建 10 相同的那些來檢查構建 15 生成的轉儲。 在項目的整個生命周期中,您最終會得到大量 PDB,因此請為此做好准備。

接下來,您需要能夠識別生成轉儲文件的應用程序的確切版本。 如果您正在創建自己的 MiniDump(例如通過調用MiniDumpWriteDump() ),可能最簡單的方法是簡單地將 MiniDump 的文件名的一部分作為應用程序的完整版本號。 您需要有一個合理的版本編號方案才能使其工作。 在我的商店中,每次自動構建器創建構建時,我們都會將所有分支的構建號加一。

現在您已經從客戶那里收到轉儲文件,您知道創建轉儲的應用程序的准確版本,並且您已經找到了此構建的 PDB 文件。

現在,您需要查看源代碼管理的歷史記錄並找到該軟件的確切版本的源代碼。 最好的方法是在每次構建時將“標簽”應用於分支。 將標簽的值設置為確切的版本號,在歷史記錄中就變得容易了。

您幾乎已准備好啟動 WinDbg/Visual C++:

  1. 獲取該版本應用程序的完整源代碼樹。 把它放在你硬盤上的一個單獨的地方,對於應用程序版本 1.0 build #100,說c:\\app_build_1.0.100
  2. 獲取該應用程序的確切版本的二進制文件,並將它們放在硬盤驅動器上的某個位置。 簡單地安裝該版本的應用程序以獲取二進制文件可能是最簡單的。
  3. 將 PDB 文件放在與步驟 2 中的二進制文件相同的位置。

現在您有兩種查看轉儲文件的選項。 您可以使用Visual Studio或 WinDbg。 使用 Visual Studio 更容易,但 WinDbg 更強大。 大多數情況下,Visual Studio 中的功能就足夠了。

要使用 Visual Studio,您所要做的就是像打開項目一樣打開轉儲文件。 打開后,“運行”轉儲文件(默認為F5 ),如果所有路徑都設置正確,它將帶您直接進入崩潰的代碼,為您提供調用堆棧等。

要使用 WinDbg,您必須跳過幾個環節:

  1. 啟動 WinDbg
  2. 打開轉儲文件。 (默認為Ctrl + D
  3. 告訴 WinDbg 去獲取正確的 MicroSoft 符號文件。 .symfix 這可能需要一些時間,因為它會從 Internet 上下載大量內容。
  4. 告訴 WinDbg 符號(PDB 文件)在哪里。 鍵入.sympath+ c:\\pdblocation ,用您放置 PDB 文件的任何位置替換路徑名。 確保你在那里得到加號,在.sympath+號之間沒有空格,否則你會搞砸第 3 步。
  5. 告訴 WinDbg 源代碼在哪里。 .srcpath c:\\app_build_1.0.100替換您從源代碼管理中獲取此版本軟件的代碼的路徑。
  6. 告訴 WinDbg 分析轉儲文件。 輸入!analyze -v

片刻之后,如果一切配置正確,WinDbg 將帶您到崩潰的位置。 在這一點上你有深挖應用程序的內存空間,關鍵部分,Windows等的狀態萬股期權但是,這遠遠超出了職位的范圍。

祝你好運!

(請參閱下面的“轉儲”部分)

使用WinDbg的基本教程和演示

“啟動”/附加 WinDBG 的不同方式

工作區

了解工作區的工作原理...

命令樹

“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 內支持的命令/功能的范圍。

編寫自己的擴展

使用 WinDBG 調試托管代碼

腳本(C#、PS、Python、WinDBG)

使用 dbgen.dll API/WinDBG 工具的調試器/工具

為事后分析生成故障轉儲文件的不同方法

轉儲分析工具

  • BlueScreenView - 查找 BSOD 后 Windows 保存的 minidump .dmp 文件,並提取有關導致崩潰的原因的信息
  • Debug.Analyzer (可以分析轉儲文件,插件可以用.NET編寫)
  • SAD - 轉儲簡單(事后分析器)
  • 波動性- 用於分析轉儲文件中記錄的“內存”的框架(備忘單

轉儲相關工具

  • Citrix dumpcheck - 檢查轉儲文件的一致性(看起來它已被放棄link + link
  • dumpchk (調試工具的一部分) - 檢查轉儲文件的一致性
  • MoonSols Windows Memory Toolkit (以前稱為windd ) - 將各種原始內存轉儲文件轉換為與 WinDBG 兼容的 dmp 文件
  • vm2dmp - Microsoft Hyper-V VM 狀態到內存轉儲轉換器
  • vmss2core - 將 VMWare 快照文件轉換為核心轉儲文件(下載),(說明

內核調試虛擬機

  • VMKD - 虛擬機 KD 擴展
  • VirtualKD -(內核調試器支持托管在 VMWare/VirtualBox 中的操作系統)

視頻

博客

一些博客(本機和托管代碼調試的混合)。

高級文章和教程資源

替代調試器

其他鏈接

這是一個非常廣泛的問題。

  1. 第一步是將轉儲文件加載到 WinDbg 實例中。
  2. 接下來,您需要確保您有一個符號設置。
  3. 最后,您可以運行命令!analyze -v對其進行基本分析。 您需要為代碼提供可用的符號信息,以使轉儲文件有價值。

網站內存轉儲、軟件跟蹤、調試、惡意軟件、受害者軟件和情報分析門戶對我來說非常有用。 我也很喜歡這本書,Mario Hewardt 和 Daniel Pravat 所著的Advanced Windows Debugging

Tess Ferrandez 有一套很棒的基礎教程和實驗室,可以幫助您開始使用 Windbg。 我強烈推薦他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM