Dot-Net
如何為 .NET 進行良好的故障轉儲?
我擷取了在 64 位 Windows 作業系統上執行的 32 位 .NET 應用程序的故障轉儲。在分析過程中,有人發現我有一個 64 位轉儲,並告訴我由於位數錯誤而無法分析此轉儲。
使用 Windows 任務管理器創建轉儲時,我不知道自己做錯了什麼。這始終適用於 32 位作業系統。
我怎樣才能為 .NET 提供良好的轉儲,尤其是使用正確的位數?
為什麼位在這裡是相關的?
由於以下原因,位數對於 .NET 應用程序很重要:
- 需要正確位數的 DAC(數據訪問控制)庫 (mscordakwks.dll)。沒有可用的跨位數 DAC。
- 調試器需要能夠載入正確位數的 SOS 調試擴展
無法將轉儲從 64 位轉換為 32 位,儘管理論上它應該包含所有必要的資訊。
如果您感覺幸運,您也可以嘗試一些說明
如何檢測應用程序的位數?
如果你不知道位數,你可以像這樣找到它:
Windows 7 任務管理器顯示
*32程序:在 Windows 8 任務管理器中,轉到
Details選項卡並添加一個名為的列Platform:Visual Studio 顯示附加到程序時的位數:
Process Explorer 可以配置為顯示
Image Type列:工具
自動檢測位數的程序:
- 程序瀏覽器
- 過程轉儲
- 微軟視覺工作室
- Windows 錯誤報告LocalDumps
擷取具有特定位數的轉儲的工具:
- 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設置
DumpType為2Visual Studio 說明
我發現許多開發人員甚至不知道 Visual Studio 可以創建轉儲。原因可能是菜單長時間不可見。這些是步驟:
- 啟動 Visual Studio:菜單不可見
- 附加到程序:菜單仍然不可見
- Break:菜單變為可見(在 Debug / Save dump as 下找到它)
為什麼要 64 位轉儲 32 位應用程序?
可能只是為了調試 WoW64 層本身。



