gpt4 book ai didi

c# - 通过 SOS 调查 CLR

转载 作者:行者123 更新时间:2023-11-30 22:05:31 31 4
gpt4 key购买 nike

目前我正在深入研究 CLR 并尝试找到我的托管对象的适当大小。

我有两个简单的类型:

XClass

    class XClass
{
public XStruct StructField = new XStruct();
public int IntField;
public double DoubleField;
}

XStruct

struct XStruct
{
public short ShortField;
public long LongField;
}

还要考虑涉及此对象的代码片段:

static unsafe void Main(string[] args)
{
double angle = 0.34;

{
double anotherDouble = 1.49;

XStruct xStruct = new XStruct();
xStruct.ShortField = 12;
xStruct.LongField = 1234567890;

XClass classObject = new XClass();
classObject.DoubleField = angle + anotherDouble;
classObject.IntField = 123;
classObject.StructField = xStruct;

<<<<<<<<BREAKPOINT>>>>>>>

xStruct.ShortField = 3;
}

double* ptr = &angle;

Console.WriteLine(*(ptr - 1));
Console.ReadKey();
}

因此,我尝试获取有关放置在堆栈中的 XStruct 的一些信息,但我无法在那里找到它。

!dso
PDB symbol for clr.dll not loaded
OS Thread Id: 0x1f94 (8084)
ESP/REG Object Name
0018EF1C 0260252c ConsoleApplication2.XClass
0018EF20 0260252c ConsoleApplication2.XClass
0018F290 0260252c ConsoleApplication2.XClass
0018F2C4 0260251c System.Object[] (System.String[])
0018F2E0 0260252c ConsoleApplication2.XClass
0018F2E8 0260252c ConsoleApplication2.XClass
0018F30C 0260251c System.Object[] (System.String[])
0018F3C0 0260251c System.Object[] (System.String[])
0018F51C 0260251c System.Object[] (System.String[])
0018F554 0260251c System.Object[] (System.String[])
0018FA90 02601238 System.SharedStatics

请解释为什么 ConsoleApplication2.XStruct 没有显示,为什么 ConsoleApplication2.XClass 显示为堆栈中的对象。我认为 XClass(作为普通引用类型)应该放在堆中。或者可能是我对 !dso 的理解不正确。

谢谢。

最佳答案

!dso == 转储堆栈对象。关注“对象”,结构不是对象。

SOS 能够找到对象引用的唯一原因是因为它可以使用抖动在编译方法时生成的元数据。垃圾收集器在执行堆栈遍历以查找对象引用时使用此数据。您可以在 this answer 中阅读更多相关信息.此元数据中缺少值类型值,GC 不关心它们。

您可以通过创建它们的数组来推断结构的大小,为结构的第一个字段提供一个独特的值。用VS调试器看数组,Debug + Windows + Memory + Memory1,把变量名放在Address字段。您将在数组头之后将结构值返回到十六进制转储中。请注意,结构大小取决于 CLR 版本和进程的位数,因此仅将此信息用作提示。

关于c# - 通过 SOS 调查 CLR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350717/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com