winDBG排錯小記
去年底,公司一個上線了近一年的系統逐漸出現訪問緩慢,操作超時的問題。本人使用winDBG工具對抓下來的內存映象進行了診斷,雖最后沒有查出什么原因,但在過程中也學到了不少東西,現記錄如下
一. “Failed to load data access DLL, 0x80004005”錯誤
這個錯誤還有另外一種提示:“The version of SOS does not match the version of CLR you are debugging”。
從原理上講,象winDBG等非托管調試工具,是使用sos.dll模塊,通過mscordacwks.dll接口,調用clr.dll實現,最終實現對.Net運行時托管代碼的訪問。這里有兩點需要注意
1. sos.dll,mscordacwks.dll這兩個之間的版本必須一致
2. sos.dll與被調用的映象運行時版本必須一致
上面兩個有任意一處不一致,都會導致上述的錯誤信息。對于我,則是服務器是.net 4.0版本,我本機是4.6版本,即報此錯誤。解決的方案有兩個
1. 使用正確版本的各個dll。一般來講,從服務器除了復制內存映象文件外,還需復制以上兩個dll,確保調試成功。至少需要復制sos.dll,winDBG在執行過程中會自動從符號文件服務器下載與當前sos.dll匹配版本的mscordacwks.dll。
2. 使用Psscor4工具。它是sos.dll的進階版,添加了若干增強工具,會自動判斷當前被調試的內存映象,下載正確匹配版本的mscordacwks.dll。推薦使用此方案。
What to do with “The version of SOS does not match the version of CLR you are debugging” in WinDbg?
“Failed to load data access DLL, 0x80004005” – OR – What is mscordacwks.dll?
二. 內存泄露是最常見的問題
公司使用的技術框架比較老,大部份仍停留在原生Sql + DataTable的方式上。我的第一反應是查詢返回的數據太多,DataTable對象可能占用了過多的內存。下面的文章具體介紹了定位方法。
使用WinDbg+SOS及WinDbg Script尋找內存中DataTable第M行N列的值
拋出的異常過多,不正確的緩存使用也會造成內存的大量浪費
調試.NET Web應用程序High Memory - Part 1
調試.NET Web應用程序High Memory - Part 2
三. 線程死鎖也是一個常見問題
使用Windbg找出死鎖,解決生產環境中運行的軟件不響應請求的問題
四. 最后,熟練掌握各條命令是活用winDBG的基礎

浙公網安備 33010602011771號