Что такое 0x% 08lx? - PullRequest
       2

Что такое 0x% 08lx?

5 голосов
/ 11 февраля 2011

В последнее время я получаю много синих экранов на своем компьютере с XP.Так много на самом деле, что я скачал инструменты отладки для Windows (x86) и анализировал аварийные дампы.Так много на самом деле, что я изменил дампы только на мини, иначе я бы, вероятно, закончил бы танкованием половину рабочего дня каждую неделю, просто ожидая, пока синий экран закончит запись подробного журнала сбоев.

Почти безисключение: каждый дамп говорит мне, что причиной появления синего экрана является какое-то неправильное распределение памяти или неправильная ссылка, и память на 0x% 08lx ссылается на 0x% 08lx и не может быть% s.

Из любопытства простоя я положил"0x% 08lx" в Google и обнаружил, что довольно много аварийных дампов включают это странное сообщение.Должен ли я считать, что 0x% 08lx - это место для чего-то значимого?«% s», который является частью заключительного предложения «Память не может быть% s», определенно выглядит так, как будто отсутствует переменная или что-то еще.

Кто-нибудь знает происхождение этого сообщения?Это на самом деле должно быть полезно и как это предполагается выглядеть?

Это не главное, что я всегда работал над этим.Просто странно, что так много людей видят это во многих аварийных дампах, и никто никогда не говорит: «О, аварийный дамп не завершил то сообщение должным образом, оно должно прочитать ...»

Я простоЛюбопытно, знает ли кто-нибудь цель этого странного артефакта сообщения об ошибке.

Ответы [ 2 ]

11 голосов
/ 11 февраля 2011

0x%08lx и %s почти наверняка являются спецификаторами формата для функции C sprintf . Но похоже, что разработчики драйверов проделали такую ​​же работу в своем коде обработки ошибок, как и в критическом коде, так как вы никогда не должны видеть эти спецификаторы в графическом интерфейсе - их следует заменить значимыми значениями.

0x%08lx должно превратиться в нечто вроде "0xE001D4AB", шестнадцатеричное 32-битное значение указателя.

%s следует заменить другой строкой, в данном случае описанием. Что-то вроде

память в 0xE001D4AB ссылается 0xE005123F и не может быть читать .

Обратите внимание, что я составил значения. По сути, произошло нарушение прав доступа в режиме ядра. Надеюсь, в мини-дампах вы увидите, какой модуль вызвал его, и удалите / обновите / что бы то ни было.

7 голосов
/ 11 февраля 2011

Я считаю, что это просто заполнитель для адреса памяти. 0x - это строковый префикс, который уведомляет пользователя о том, что он является шестнадцатеричным, в то время как %08lx является фактическим заполнителем для длинного целого (l), преобразованного в шестнадцатеричное (x) с заполнением 8 нулями ( 08).

...