Расхождение в! 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