Windbg調試SOS.DLL和CLR 不匹配問題

我們在用windbg調試客戶發來的dump文件的時候,如果不是相同的環境的話,很容易出現這個現象,簡單的說就是程序運行機器上的CLR與當前開發調試人員機器上的CLR是不同的版本,從而導致開發人員機器上的SOS.dll與dump file中要求的SOS.dll不一樣(比如應用程序要求是.net framework 4.6,所以客戶機安裝的就是.net 4.6,但是開發人員機器上安裝的是.net 4.7)。

我們在open crash dump之後。輸入命令.loadby sos clr,這時候是成功的,但是在運用擴展命令的時候就顯示失敗,比如!dumpheap,這時候顯示CLR version和SOS version 不匹配,這個時候你就需要將客戶機器(相同環境機器也行)上的sos.dll複製到調試機器上隨便一個文件夾,比如C:\temp\目錄下,然後運行.load c:\temp\sos.dll,這時候也會成功。

在執行上述過程之後,還是不能調試,因爲sos.dll還對應一個mscordacwks.dll, 同時你還需要將這個dll從客戶機器上覆制過來,放到symbol所在的目錄或者source文件所在的目錄下都行, 但是需要改名字,名字的規則如下:

mscordacwks_AAA_AAA_x.x.x.xxxx.dll 

其中AAA是dump的bit位對應的(x86 or AMD64),x.x.x.x實際上就是mscordacwks.dll的版本號(可以從文件的property dialog中查到),比如2.0.50272.8763, 4.7.2114.0等。

然後運行.cordll -ve -u -l   命令,就能查看出該dll被成功加載,並且顯示之前的dll不匹配SOS.dll版本。

經過上面的過程之後就能利用SOS 擴展命令正常調試了。

注:如果你不知道怎麼改mscordacwks.dll名字,可以先運行.cordll -ve -u -l,就會顯示當前的版本不匹配SOS的版本,需要的dll的名字是什麼。

客戶機dll的路徑: c:\windows\microsoft.NET\framework\各個版本目錄下,根據上面命令的提示可以找到對應的文件夾,比如4.0之後的都是在4.0.*目錄下,2.0的都是在2.0.*目錄下。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章