WinDBG 出現 SOS does not support the current target architecture ?!

前幾天 production server 上的出現 CPU high 的 warning,當下立馬想到使用 WinDBG 來追查問題發生原因,只是我使用 WinDBG 的頻率不高,每次在使用前都要再花一些時間查語法,幸虧黑大日前的文章 - WinDBG 應用實例:找出 ASP.NET CPU 100% 原因 列舉幾個常用的 WinDBG 語法,讓使用 WinDBG 時的前置時間縮短不少,可以更有效率地專注在追查問題原因

以往使用 WinDBG 時都還算順利,但這次卻出現 SOS does not support the current target architecture 的狀況,讓追查動作無法繼續下去,所以立馬來紀錄一下這次使用 WinDBG 的經驗

操作流程

  1. 下載並安裝 WinDBG

    Download Debugging tools for Windows

  2. 開啟 WinDBG

    • 32 位元64 位元 版本差異
    • 預設安裝位置在 C:\Program Files (x86)\Windows Kits\10\Debuggers\ 資料夾下

      1windbgpath

  3. 匯入 dump file (.dmp)

    • 主選單 File –> Open Crash Dump...

      2opendump

  4. 依黑大文章 執行相關指令(以下指令內容節錄黑大文章內容)

    • .sympath srv*D:\Symbol*https://msdl.microsoft.com/download/symbols

      分析過程需要 Symbol 檔,指定 WinDbg 自動由微軟網站下載,並 Cache 在 D:\Symbol 目錄避免重複下載

      3symbolpath

    • !sym noisy

      指定顯示完整 Symbol 下載資訊

      4symbolnoisy

    • .cordll -ve -u -l

      自動載入 CLR 偵錯相關模組

      5loaddll

      • 用 64 位元 windbg 開 32 位元 dump file 就會出現找不到 dll 的錯誤

        Unable to load DLL mscordacwks_AMD64_x86_4.0.30319.18449.dll, Win32 error 0n87
        

        6loaddllerror

    • !runaway

      依使用 CPU 時間將 thread 排序

      7runaway

    • ~{thread id}s

      切換至指定 thread

      8thread

      • 如使用不正確的 WinDBG 版本 (3264 位元) 開啟 .dump 會出現 wow64cpu!CpupSyscallStub+0x2:

        10wow64cpu

    • !clrstack

      列出該 thread 的 callstack

執行 !clrstack 時出現錯誤訊息

  • 錯誤訊息內容

    SOS does not support the current target architecture.
    
  • 錯誤訊息截圖

    9clrstack

問題發生原因及解決方式

  • 32 位元程式未使用 32 位元 task manager 匯出 dump file

    • 32 位元 task manager 位於 C:\Windows\SysWOW64\Taskmgrexe
    • 開啟後名稱為:Task Manager (32 bit)

    11taskmgr32bit

    • 同時僅能開啟一個 task manager,如已開啟 64 bit task manager 需先關閉才能開啟 32 bit task manager
  • IIS - Application Pools 可以強制設定為 32 位元

    這就是我這次遇到狀況的實際源頭,現在多數 server 都是 64 位元,預設 IIS 也是使用 64 位元模式執行,但如果程式本身使用到僅支援 32 位元元件(ex. Oracle.DataAccess.x86) 就必需強制啟用 32 位元模式

    • IIS - Application Pools –> {Name} –> Advanced Settings

    12apppools

    • Enable 32-Bit Applications

    13enable32bit

心得

一開始想不通為什麼明明是 64-bit server 怎麼會出現 WinDBG 版本錯誤的訊息(wow64cpu!CpupSyscallStub+0x2) 而需要使用 x86 WinDBG 開啟,持續深入偵錯才又發現新的錯誤:SOS does not support the current target architecture. 才知道原來需要使用 32-bit task manager 匯出 dump file,經過一些實驗後終於證實是 application pool 設定的結果

經過這一連串的 debug 過程對於 WinDBG 的使用與指令都有更深的印象,非常感謝黑大文章 - WinDBG 應用實例:找出 ASP.NET CPU 100% 原因 幫了很大的忙,希望下次使用可以更得心應手

參考資訊

  1. WinDBG 應用實例:找出 ASP.NET CPU 100% 原因
  2. Common WinDbg Commands (Thematically Grouped)
  3. Download Debugging tools for Windows
  4. SOS does not support the current target architecture
  5. Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)