2016-12-27 96 views
0

我有簡單的控制檯應用程序(目標框架4.5.2):無法找到運行clr.dll使用SOS

using System; 

public class SosTest 
{ 
    public class Foo 
    { 
     public Foo() 
     { 
      Console.WriteLine("Creation of foo"); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var n1 = new Foo(); 
     var n2 = new Foo(); 
     Console.WriteLine("Allocated objects"); 
     Console.WriteLine("Press any key to invoke GC"); 
     Console.ReadKey(); 
     n2 = n1; 
     n1 = null; 
     GC.Collect(); 
     Console.WriteLine("Press any key to exit"); 
     Console.ReadKey(); 
    } 
} 

我想看看託管堆的狀態。我做以下步驟:

  1. 開放的WinDbg我的程序與WinDBG的「開放可執行文件」命令
  2. 打開exe文件
  3. 執行命令加載SOS .load MicrosoftNet\Framework\v4.0.30319\sos.dll
  4. 執行命令來查看堆!eeheap -gc
  5. 的狀態

但最後一個命令過程中出現了以下消息:

無法找到運行時DLL(clr.dll),0x80004005 擴展命令需要clr.dll纔能有所作爲。

爲什麼命令!eeheap -gc失敗?

如果這將有助於它是lm命令的結果:

0:000> lm 
start end  module name 
00be0000 00be8000 ConsoleApplication1 (deferred)    
734c0000 73519000 MSCOREE (deferred)    
74c20000 74d00000 KERNEL32 (deferred)    
753d0000 75571000 KERNELBASE (deferred)    
77d80000 77f03000 ntdll  (pdb symbols) 

回答

4

我不知道你正在做的是正確的方式或沒有,但我用下面的命令來做到這一點:

sxe ld clrjit; g 

和寫入之後:

.loadby sos clr 

sxe ld clrjit通知當clrjit模塊加載調試器時,g標誌是用於繼續執行和.loadby sos clr將加載SOS調試從位置,其中它發現clr.dll

我曾經看過以下以下兩個plural-我發現C#內幕通過Bart de Smet視線課程他們極大的理解C#的見解和CLR:

C# Language Internals - Part 1

C# Language Internals - Part 2

+0

'.loadby'命令需要使用'clr'模塊。這通常比'clrjit'更早加載,所以'sxe ld clr'可能就足夠了。 –

相關問題