!objsize中的差异,以十六进制和十进制表示

时间:2016-04-13 02:03:53

标签: windbg sos sosex

我使用!objsize 命令来获取对象的真实值。例如,当我运行下面的命令时,它告诉我地址​​00000003a275f218处的对象大小是18十六进制,转换为十进制24。

0:000> !ObjSize 00000003a275f218 
sizeof(00000003a275f218) = 24 (0x18) bytes 

到目前为止一切顺利。我在一个对象上运行相同的命令,它的大小似乎在十六进制和十进制之间有差异。 enter image description here

所以十六进制的大小是0xafbde200。当我使用我的计算器将其转换为十进制时,这将变为 2948456960 ,而命令的输出显示十进制大小为 -1346510336 。有人可以帮我理解为什么尺寸有差异吗?

2 个答案:

答案 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