文章目錄
DebugDiag 2 Analysis 出現 DacError
繼前篇筆記 WinDBG 出現 SOS does not support the current target architecture ?! 紀錄在使用 WinDBG 偵錯 production issue 時遇到使用 64-bit 工作管理員匯出 32-bit 程式的 dump 而無法順利完成偵錯的狀況
遇到問題當下並沒有其他心思去偵錯 WinDBG 所以立馬改使用黑大在 ASP.NET CPU 飆高問題之傻瓜分析工具-DebugDiag Tools 一文中介紹的 Debug Diagnostic Tool (DebugDiag)
來查問題,但第一次使用 Debug Diagnostic Tool (DebugDiag),加上問題源頭原本就與工具無關,並沒有順利查出問題根源
在使用 Debug Diagnostic Tool (DebugDiag)
過程遇到不常見的錯誤訊息,於是紀錄一下使用經驗
操作步驟
下載並安裝
Debug Diagnostic Tool
(最新版為:Debug Diagnostic Tool v2 Update 2)有 x86 與 x64 版本,請依執行環境選擇
Dump Analysis 是分析工具也是本文的主角
開啟
DebugDiag 2 Analysis
並 匯入 dump file搜尋
DebugDiag 2 Analysis
Add Data Files
選擇分析規則
PerAnalysis
執行分析(Start Analysis)
分析報告為
.mht
檔,請使用 IE 開啟效果跟版面才會正常IE
Chrome (基本的圖形跟連結都無法使用)
分析報告出現錯誤警示
我嘗試匯入兩份 dump file,都得到 dac 異常的錯誤,但錯誤細節內容不同
警示訊息內容
dump 1
Analysis results may be incomplete because an error occurred while initializing the CLR diagnostic runtime for w3wp.DMP. Dump File: w3wp.DMP Type: Microsoft.Diagnostics.Runtime.ClrDiagnosticsException Message: Failure loading DAC: CreateDacInstance failed 0x8000ffff Stack Trace: Microsoft.Diagnostics.Runtime.DacLibrary..ctor(DataTargetImpl dataTarget, String dacDll) Microsoft.Diagnostics.Runtime.DataTargetImpl.CreateRuntime(String dacFilename) DebugDiag.DotNet.NetDbgObj.CreateRuntime(String symbolPath, DataTarget target, Int32 runtimeIndex, ClrInfo& clrInfo) DebugDiag.DotNet.NetDbgObj.CreateRuntimeAndGetHeap(String dumpPath, IDbgObj3 legacyDebugger, String symbolPath, Boolean throwOnBitnessMismatch, Boolean loadClrHeap) HResult: DacError
dump 2
Analysis results may be incomplete because an error occurred while initializing the CLR diagnostic runtime for 199w3wp.DMP. Dump File: 199w3wp.DMP Type: DebugDiag.DotNet.DacNotFoundException Message: CLR is loaded in the target, but the correct dac file cannot be found. DacFileName: mscordacwks_X86_Amd64_4.0.30319.18449.dll. DacLocation:
警示訊息截圖
dump 1
dump 2
問題發生原因以及解決方式
發生原因與 WinDBG 出現 SOS does not support the current target architecture ?! 相同,皆是 32-bit 程式未使用 32-bit task manager 匯出 dump file 引起
32 位元程式未使用 32 位元 task manager 匯出 dump file
- 32 位元 task manager 位於
C:\Windows\SysWOW64\Taskmgr.exe
開啟後名稱為:
Task Manager (32 bit)
同時僅能開啟一個 task manager,如已開啟 64 bit task manager 需先關閉才能開啟 32 bit task manager
- 32 位元 task manager 位於
IIS - Application Pools 可以強制設定為 32 位元
這就是我這次遇到狀況的實際源頭,現在多數 server 都是 64 位元,預設 IIS 也是使用 64 位元模式執行,但如果程式本身使用到僅支援 32 位元元件(ex. Oracle.DataAccess.x86) 就必需強制啟用 32 位元模式
IIS - Application Pools –> {Name} –> Advanced Settings
Enable 32-Bit Applications
心得
同時使用 WinDBG
與 DebugDiag 2 Analysis
下,DebugDiag 2 Analysis
明顯比 WinDBG
好上手許多,使用上也沒有 x86 兆 x64 限制,加上不用記指令,非常方便
不過 DebugDiag 2 Analysis
產出的報表卻只有 IE 能開?! 使用 edge 開啟會提示是否要開啟 .mht
接著透過 IE 開啟,Chrome 還直接大跑版,雖然體驗沒那麼好,但還能接受,畢竟本來 UI/UX 就不是 debug production issue 的重點
不過有一點倒是 WinDBG
勝過 DebugDiag 2 Analysis
不少,就是關於使用錯誤 task manager 匯出 dump file 的錯誤提示易讀性:
WinDBG
:SOS does not support the current target architectureDebugDiag 2 Analysis
:Analysis results may be incomplete because an error occurred while initializing the CLR diagnostic runtime for w3wp.DMP
要不是已經知道問題發生原因,不然光看錯誤訊息還真不知道該如何查起XD
參考資訊
文章作者 Yowko Tsai
上次更新 2021-11-03
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。