我使用!objsize 命令来获取对象的真实值。例如,当我运行下面的命令时,它告诉我地址00000003a275f218处的对象大小是18十六进制,转换为十进制24。
0:000> !ObjSize 00000003a275f218
sizeof(00000003a275f218) = 24 (0x18) bytes
到目前为止一切顺利。我在一个对象上运行相同的命令,它的大小似乎在十六进制和十进制之间有差异。
所以十六进制的大小是0xafbde200。当我使用我的计算器将其转换为十进制时,这将变为 2948456960 ,而命令的输出显示十进制大小为 -1346510336 。有人可以帮我理解为什么尺寸有差异吗?
答案 0 :(得分:3)
这是SOS中的一个错误。如果查看source code,您会发现声明为
的方法DECLARE_API(ObjSize)
它使用以下格式作为输出
ExtOut("sizeof(%p) = %d (0x%x) bytes (%S)\n", SOS_PTR(obj), size, size, methodTable.GetName());
如您所见,它使用%d
作为格式说明符,用于带符号的十进制整数。对于无符号十进制整数,这应该是%u
,因为显然你不能使用负数量的内存。
如果您知道如何使用Git,则可以提供补丁。
您可以在WinDbg中使用?
查看无符号值:
0:000> ? 0xafbde200
Evaluate expression: 2948456960 = 00000000`afbde200
答案 1 :(得分:2)
差异是标志。它似乎是将第一位(由于第一个十六进制字节为1,#34; A")为1,将其解释为负号。这两个数字在其他方面是相同的。
在calc.exe(程序员模式)上粘贴-1346510336,切换到十六进制:
FFFFFFFFAFBDE200
粘贴2948456960,切换到十六进制:
AFBDE200