目前我正在深入挖掘CLR並嘗試找到適當的管理對象大小。通過SOS調查CLR
我有兩個簡單類型:
XClass
class XClass
{
public XStruct StructField = new XStruct();
public int IntField;
public double DoubleField;
}
和XStruct
struct XStruct
{
public short ShortField;
public long LongField;
}
而且cosider代碼段這個對象涉及:
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 026System.SharedStatics
請解釋爲什麼不顯示ConsoleApplication2.XStruct
爲什麼ConsoleApplication2.XClass
顯示爲棧對象。我認爲XClass(作爲正常的參考類型)應該放在堆中。或者可能是我對!dso
的理解不正確。
謝謝。
您可以查看對象大小的元數據。在這裏你可以找到代碼。 https://github.com/mumusan/dotnetex –
@Dmitry Dovgopoly:我不是在尋找XStruct的大小。我感興趣的是爲什麼它不顯示爲堆棧對象。 – frankie
它沒有打印出你的雙變量。顯然,值類型的本地不打印。 http://msdn.microsoft.com/en-us/library/bb190764(v=vs.110).aspx – usr