Windbg 不一致!十六进制和十进制的对象大小

Windbg 不一致!十六进制和十进制的对象大小,windbg,sos,sosex,Windbg,Sos,Sosex,我使用!objsize命令以获取对象的真实值。例如,当我运行下面的命令时,它告诉我地址0000000 3A275F218处的对象大小为18十六进制,转换为十进制的24 0:000> !ObjSize 00000003a275f218 sizeof(00000003a275f218) = 24 (0x18) bytes 到目前为止还不错。我在一个对象上运行相同的命令,它的大小似乎在十六进制和十进制之间存在差异。 所以十六进制的大小是0xafbde200。当我使用我的计算器将其转换为十

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

0:000> !ObjSize 00000003a275f218 
sizeof(00000003a275f218) = 24 (0x18) bytes 
到目前为止还不错。我在一个对象上运行相同的命令,它的大小似乎在十六进制和十进制之间存在差异。


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

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

在calc.exe上粘贴-1346510336(程序员模式),切换到十六进制:

FFFFFFFFBDE200

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


AFBDE200是SOS中的一个bug。如果查看,您将发现声明为

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

那么这个物体的真实尺寸是多少呢。我应该相信十六进制还是十进制的值?我会取正值,我看不出objsize函数真正的含义是否定的。你的意思是你将+1346510336作为对象的大小,或者2948456960?2948456960。如果你把0xAFBDE200看作是一个未签名的值,那就是这个值,所以这可能是一个错误!ObjSize命令在哪里显示不正确的十进制值?非常好,感谢您花时间检查源代码!