2013-06-21 59 views
5

我已經都加載.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模塊之一,但仍沒有運氣。

回答

4

這是一個非常難看的問題,afaik沒有簡單的解決方案。核心問題是,您的客戶使用CLR的不同修訂版,而不是您的版本。有一些可能性,考慮到版本號差別很大,你已經安裝了.NET 4.5並且客戶使用的是.NET 4.0。但只是一個安全補丁可能足以導致不匹配,他們已經穩步晚了。

Afaik你幾乎堅持設置一個虛擬機或機器,它使用確切相同的修訂版,作爲您的客戶使用。

.NET 4中的進程內並行CLR功能可以解釋如何在一個進程中最終生成兩個CLR版本。 v2.0版本通常會在那裏實現一個COM服務器。您可以通過添加對[ComVisible] .NET程序集的引用來避免這種情況。儘管這可能不是你的代碼。祝你好運,這不是一個好問題。

+0

它確實難看。由於我們的插件架構,問題發生。應用程序本身是.NET2,所以最初使用.NET。然後插件使用.NET4,所以這也將被加載。 –