【发布时间】:2014-06-22 11:20:31
【问题描述】:
目前我正在深入研究 CLR 并尝试找到我的托管对象的适当大小。
我有两种简单的类型:
XClass
class XClass
{
public XStruct StructField = new XStruct();
public int IntField;
public double DoubleField;
}
和XStruct
struct XStruct
{
public short ShortField;
public long LongField;
}
还要考虑涉及此对象的代码 sn-p:
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 = ∠
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 的理解不正确。
谢谢。
【问题讨论】:
-
您可以查看元数据以了解对象大小。在这里你可以找到代码。 github.com/mumusan/dotnetex
-
@Dmitry Dovgopoly:我不是在寻找 XStruct 的大小。我对它为什么不显示为堆栈对象感兴趣。
-
它也没有打印出你的双变量。显然,不打印值类型的本地变量。 msdn.microsoft.com/en-us/library/bb190764(v=vs.110).aspx
-
@usr 有没有办法打印值类型的本地变量? !dso 或其他参数的任何参数?