2

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

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

到目前为止,一切都很好。我在一个对象上运行相同的命令,它的大小似乎在十六进制和十进制之间存在差异。 在此处输入图像描述

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

4

2 回答 2

3

这是 SOS 中的一个错误。如果您查看源代码,您会发现声明为的方法

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
于 2016-04-13T04:26:00.387 回答
2

差异是标志。它似乎将第一位(因为第一个十六进制字节是“A”而为 1)解释为负号。这两个数字在其他方面是相同的。

将 -1346510336 粘贴到 calc.exe(程序员模式)上,切换到 Hex:

FFFFFFFFAFBDE200

粘贴 2948456960,切换到十六进制:

AFBDE200

于 2016-04-13T02:07:07.900 回答