Расхождение в! Objsize в шестнадцатеричном и десятичном виде

Я использую команду ! Objsize, чтобы получить истинное значение объекта. Например, когда я запускаю команду ниже, она говорит мне, что размер объекта по адресу 00000003a275f218 равен 18 шестнадцатеричным, что переводится в 24 в десятичном виде.

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

Все идет нормально. Я выполняю ту же команду для объекта, и его размер, кажется, имеет расхождение между шестнадцатеричным и десятичным.

Таким образом, размер в шестнадцатеричном является 0xafbde200. Когда я конвертирую его в десятичное число с помощью моего calc, получается 2948456960, тогда как выходные данные команды показывают десятичный размер -1346510336. Может кто-нибудь помочь мне понять, почему есть разница в размерах?

2 ответа

Решение

Это ошибка в 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

Разница это знак. Кажется, что он интерпретирует первый бит (который равен 1, поскольку первый шестнадцатеричный байт "A") как отрицательный знак. Эти два числа в остальном одинаковы.

Вставьте -1346510336 в calc.exe (режим программиста), переключитесь на Hex:

FFFFFFFFAFBDE200

Вставьте 2948456960, переключитесь на шестнадцатеричный код:

AFBDE200

Другие вопросы по тегам