Dot-Net

如何為 .NET 進行良好的故障轉儲?

  • August 29, 2015

我擷取了在 64 位 Windows 作業系統上執行的 32 位 .NET 應用程序的故障轉儲。在分析過程中,有人發現我有一個 64 位轉儲,並告訴我由於位數錯誤而無法分析此轉儲。

使用 Windows 任務管理器創建轉儲時,我不知道自己做錯了什麼。這始終適用於 32 位作業系統。

我怎樣才能為 .NET 提供良好的轉儲,尤其是使用正確的位數?

為什麼位在這裡是相關的?

由於以下原因,位數對於 .NET 應用程序很重要:

  • 需要正確位數的 DAC(數據訪問控制)庫 (mscordakwks.dll)。沒有可用的跨位數 DAC。
  • 調試器需要能夠載入正確位數的 SOS 調試擴展

無法將轉儲從 64 位轉換為 32 位,儘管理論上它應該包含所有必要的資訊。

如果您感覺幸運,您也可以嘗試一些說明

如何檢測應用程序的位數?

如果你不知道位數,你可以像這樣找到它:

Windows 7 任務管理器顯示*32程序: Windows 7 任務管理器

在 Windows 8 任務管理器中,轉到Details選項卡並添加一個名為的列PlatformWindows 8 任務管理器

Visual Studio 顯示附加到程序時的位數: Visual Studio 中的位數

Process Explorer 可以配置為顯示Image Type列: 程序資源管理器中的位數

工具

自動檢測位數的程序:

擷取具有特定位數的轉儲的工具:

  • 64 位:64 位作業系統上的預設任務管理器
  • 32 位:任務管理器從 64 位作業系統上的 %windir%\SysWOW64\taskmgr.exe 執行
  • 64 位:使用命令行開關執行ProcDump-64
  • 32 位:WinDbg x86 版本
  • 64 位:WinDbg x64 版本
  • 32 位:DebugDiag x86 版本
  • 64 位:DebugDiag x64 版本
  • 32 位:ADPlus x86 版本
  • 64 位:ADPlus x64 版本

只需根據您的應用程序選擇位數,而不是根據作業系統。

為什麼記憶在這裡是相關的?

對於 .NET,您需要完整的記憶體轉儲,否則您無法確定對象的內容。要包含完整記憶體,請執行以下操作:

  • 在 WinDbg 中,指定/ma何時執行.dump
  • Process Explorer中,選擇“創建完整轉儲”(雖然從技術上講,結果仍然是一個小型轉儲)
  • ProcDump中,應用-ma命令行開關
  • 在 Visual Studio 中,選擇“帶堆的小型轉儲”
  • 任務管理器將始終創建具有完整記憶體的轉儲
  • 對於 Windows 錯誤報告LocalDumps設置DumpType2

Visual Studio 說明

我發現許多開發人員甚至不知道 Visual Studio 可以創建轉儲。原因可能是菜單長時間不可見。這些是步驟:

  • 啟動 Visual Studio:菜單不可見
  • 附加到程序:菜單仍然不可見
  • Break:菜單變為可見(在 Debug / Save dump as 下找到它)

為什麼要 64 位轉儲 32 位應用程序?

可能只是為了調試 WoW64 層本身。

引用自:https://stackoverflow.com/questions/24874027