簡體   English   中英

如何為.NET提供良好的故障轉儲?

[英]How do I take a good crash dump for .NET?

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

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

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

為什么在這里有點相關?

對於.NET應用程序而言,這一點很重要,原因如下:

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

將轉儲從64位轉換為32位是不可能的,盡管理論上它應該包含所有必要的信息。

如果你感到幸運,你也可以嘗試一些指示

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

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

Windows 7任務管理器在進程上顯示*32 Windows 7任務管理器

在Windows 8任務管理器中,轉到“ Details選項卡並添加名為“ Platform的列: Windows 8任務管理器

Visual Studio在附加到進程時顯示位數: Visual Studio中的比特

可以將Process Explorer配置為顯示“ Image Type列: Process Explorer中的位數

工具

自動檢測位數的程序:

捕獲具有特定位數的轉儲的工具:

  • 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中,在執行.dump時指定/ma
  • Process Explorer中 ,選擇“Create full dump”(雖然從技術上講,結果仍然是minidump)
  • ProcDump中 ,應用-ma命令行開關
  • 在Visual Studio中,選擇“帶堆的Minidump”
  • 任務管理器將始終創建具有完整內存的轉儲
  • 對於Windows錯誤報告LocalDumpsDumpType設置為2

Visual Studio說明

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

  • 啟動Visual Studio:菜單是不可見的
  • 附加到進程:菜單仍然不可見
  • 中斷:菜單變得可見(在Debug / Save dump下找到它)

為什么要對32位應用程序進行64位轉儲?

可能僅用於調試WoW64層本身。

暫無
暫無

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

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