我已經都加載.NET版本轉儲:在轉儲使用SOS與.NET 2(mscorwks)和.NET 4(CLR)
0:000> lm m clr
start end module name
65490000 65aff000 clr (deferred)
0:000> lm m mscorwks
start end module name
6a980000 6af2c000 mscorwks (deferred)
現在我不確定這SOS版本使用。兩者都將無問題地加載。
0:000> .loadby sos mscorwks
0:000> .loadby sos clr
我該如何找出最適合我的分析的版本?或者我會一直需要兩個?
.cordll -ve -u -l在這種情況下可靠嗎?
.symfix c:\symbols
.cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.0.30319.18047 f:8
doesn't match desired version 4.0.30319.296 f:8
CLRDLL: Loaded DLL c:\symbols\mscordacwks_x86_x86_4.0.30319.296.dll\50484AA966f000\mscordacwks_x86_x86_4.0.30319.296.dll
CLR DLL status: Loaded DLL c:\symbols\mscordacwks_x86_x86_4.0.30319.296.dll\50484AA966f000\mscordacwks_x86_x86_4.0.30319.296.dll
線程0顯示mscorwks。使用命令:
~0s
k
=== UPDATE ===
.cordll
原則是確定的。默認情況下,它將使用.NET 4框架。此行爲可以通過.cordll -I
進行更改。
我已獲得SOS的兩個版本相匹配的目標計算機的其中並加載由路徑
.load C:\SOS\4.0.30319.296\SOS.dll
我已經升級,從6.2的WinDbg到最新的6.3。仍然不是更好。
我也問過史蒂夫約翰遜,SOSEX的作者誰建議.cordll -I
,但是這也不能在我的轉儲中,無論是模塊名稱還是基地址。
.cordll -I clr
.cordll -I 65490000
任何嘗試運行!threads
總是導致
無法要求ThreadStore。
任何嘗試運行!clrstack
總是導致
無法行走的管理堆棧。當前線程可能不是託管線程。您可以運行!線程來獲取進程中託管線程的列表。
=== UPDATE ===
正如馬里奧·赫沃特建議的,與指定完整SOS路徑的複雜的情況,可以通過僅載入一個SOS擴展到處理(或在卸載情況下,一個能夠避免它們已經被加載),或者我們可以使用.setdll
來定義我們喜歡的默認SOS版本。
但是,這並沒有改善分析。
=== UPDATE ===
我也試圖通過.reload /u
在希望的WinDbg/SOS不會在衝突的任何更多卸載.NET模塊之一,但仍沒有運氣。
它確實難看。由於我們的插件架構,問題發生。應用程序本身是.NET2,所以最初使用.NET。然後插件使用.NET4,所以這也將被加載。 –