无法找到运行时clr.dll来使用sos

时间:2016-12-27 14:21:45

标签: c# debugging clr windbg sos

我有简单的控制台应用程序(目标框架4.5.2):

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
  2. 使用windbg的“open executable”命令打开我的程序的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)
    

1 个答案:

答案 0 :(得分:5)

我不确定你是否正确行事,但我过去常常使用以下命令:

sxe ld clrjit; g

之后写:

.loadby sos clr

sxe ld clrjit在加载 clrjit模块时通知调试器,g标志用于继续执行,.loadby sos clr将加载 sos调试器从找到 clr.dll

的位置

我曾经Bart de Smet C#Internals 上看过以下两个复视课程,我发现它们非常适合理解c#和clr的见解:

C# Language Internals - Part 1

C# Language Internals - Part 2