2013-06-21 22 views
5

:.NET 4 (clr) ben hem .NET versiyonları yüklendikten bir dökümü var

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) 

Şimdi SOS sürümü belirsiz olduğum kullanmak. Her ikisi de sorunsuz bir şekilde yüklenir.

0:000> .loadby sos mscorwks 
0:000> .loadby sos clr 

Analize yaptığım en uygun sürümü nasıl bulabilirim? Yoksa her ikisine de ihtiyacım olacak mı?

.cordll -ve -u -l bu durumda güvenilir mi?

.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 

İleti 0 mscorwks gösteriliyor. Komutları kullandı: prensipte

~0s 
k 

=== GÜNCELLEME ===

.cordll tamam. Varsayılan olarak .NET 4 çerçevesini kullanacaktır. Bu davranış .cordll -I ile değiştirilebilir.

ben WinDbg 6.2 ila 6.3, en son sürümüne geçiş yapmış yolunun

.load C:\SOS\4.0.30319.296\SOS.dll 

tarafından hedef bilgisayarın eşleşecek SOS her iki sürümünü elde edilmiş ve yüklediniz. Hala daha iyi değil.

Ayrıca, .cordll -I'u öneren SOSEX'in yazarı Steve Johnson'a da sordum, fakat bu aynı zamanda, ne modül adı ne de temel adresle birlikte çöplüğümde de çalışmıyor. !threads çalıştırmak için

.cordll -I clr 
.cordll -I 65490000 

herhangi bir girişim her zaman ThreadStore istenemedi

sonuçlanır. !clrstack çalıştırmak için

herhangi bir girişim hep idare yığını yürüyemez

sonuçlanır. Geçerli iş parçacığı muhtemelen yönetilen bir iş parçacığı değil. Süreçte yönetilen iş parçacıklarının bir listesini almak için iş parçacığı çalıştırabilirsiniz.

=== GÜNCELLEME ===

Mario Hewardt önerdiği gibi, tam SOS yolu belirterek karmaşık senaryo yalnızca sürecine bir SOS eklenti yüklemek (veya durumda birini boşaltma önlenebilir zaten yüklenmişler) veya beğendiğimiz varsayılan SOS sürümünü tanımlamak için .setdll'u kullanabiliriz. Bununla birlikte, bu, analizi geliştirmemektedir.

=== GÜNCELLEME ===

Ben de WinDbg/SOS artık bir çatışma olmaz umuduyla .reload /u .NET modüllerinden birini boşaltma denedi

ama hala şans.

cevap

4

Bu çok çirkin bir sorundur ve afaik bunun için basit bir çözüm yoktur. Temel konu, müşterinizin, CLR'nin sizden farklı bir revizyonu kullanmasıdır. Bazı olasılıklarla, çılgınca farklı revizyon numaraları göz önüne alındığında, .NET 4.5 yüklü ve müşteri .NET 4.0 kullanıyor. Ancak, bir uyumsuzluğa yol açmak için sadece bir güvenlik yaması yeterli olabilir, geç saatlere doğru geliyorlar.

Afaik, bir VM veya makineyi, müşterinizin kullandığı tam revizyonunu kullanan bir çok ayarlanmış durumdadır.

.NET 4'te işlem sırasında yan yana CLR özelliği, bir işlemde iki CLR sürümüyle nasıl sonuçlanabileceğinizi açıklayabilir. V2.0 sürümü genellikle bir COM sunucusu uygulamak için orada olurdu. Bunun yerine, [ComVisible] .NET derlemesine bir başvuru ekleyerek kaçınmanız gereken bir şey. Bunu yapan kodunuz olmayabilir de. İyi şanslar, sahip olmak hoş bir problem değil. Bu blog yayınında kaplıdır açıkça mscordacwks.dll, yüklemek için karmaşık .cordll komutlarını kullanmak zorunda kalacak

+0

Gerçekten çirkin. Sorun, eklenti mimarimiz nedeniyle gerçekleşir. Uygulamanın kendisi .NET2, yani başlangıçta .NET kullanılıyor. Eklentiler daha sonra .NET4'ü kullanır, böylece bu da yüklenir. –