我有简单的控制台应用程序(目标框架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();
}
}
我想查看托管堆的状态。我执行以下步骤:
.load MicrosoftNet\Framework\v4.0.30319\sos.dll
!eeheap -gc
但在最后一个命令中,我得到以下信息:
无法找到运行时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)
答案 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的见解: