Для ответа на вопрос привилегированная команда является кодом операции процессора (ассемблерная инструкция), который может только быть выполнен в "супервизоре" (или Кольцо 0) режим. Эти типы инструкций имеют тенденцию привыкнуть к устройствам ввода-вывода доступа и защищенным структурам данных от ядра окон.
Обычные программы выполняются в "непривилегированном режиме" (Кольцо 3), который запрещает прямой доступ к устройствам ввода-вывода, и т.д.
Как упомянутые другие, причиной является, вероятно, поврежденный стек или испорченный вызов указателя функции.
Такого рода вещи обычно происходят при использовании указателей на функции, которые указывают на недопустимые данные. Это также может произойти, если у вас есть код, который очищает ваш стек возврата. Иногда бывает довольно сложно отследить подобные ошибки, потому что их обычно трудно воспроизвести.
Привилегированная команда является инструкцией IA-32, которой только позволяют быть выполненной в Кольце 0 (т.е. привилегированный режим). При ударе этого в пространстве пользователя Вы или получили действительно старый EXE или поврежденный двоичный файл.
Первая вероятность, о которой я могу подумать, это то, что вы можете использовать локальный массив, и он находится в верхней части объявления функции. Ваша проверка границ сошла с ума и перезаписывает адрес возврата, и он указывает на некоторую инструкцию, которую может выполнять только ядро.
Как я подозревал, это было что-то глупое, что я сделал. Я думаю, что решил это вдвое более быстрое из-за некоторых подсказок в комментариях в сообщениях выше. Благодаря тем особенно те, кто указал на что-то рано в приложении, перезаписывающем стек. Я на самом деле нашел несколько ответов здесь более полезными, который сообщение я отметил как ответ на вопрос как они хорошо осведомленный и поставил меня в очередь как, туда, где посмотреть, хотя я думаю, что это лучше всего подводит итог ответа.
Как оказалось, я только что добавил кнопку, которая пробежалась через максимальный размер массива, содержащего некоторую информацию кнопки на панели инструментов (который был на стеке). Я забыл, что
#define MAX_NUM_TOOBAR_BUTTONS (24)
даже существовал!
Местоположение ошибки 0x00486752 кажется мне очень маленьким, до того места, где обычно живет исполняемый код. Я согласен с Даниэлем, это выглядит как дикий указатель на меня.
Я видел это с Visual C++ 6.0 в 2000 году.
библиотека C++ отладки имела вызовы к физическим инструкциям по вводу-выводу в ней в обработчике исключений. Если я помню правильно, это выводило состояние к порту I/O, который раньше был для базовых регистров DMA, которые я предполагаю, что кто-то в Microsoft использовал для карты отладчика.
Ищут некоторое состояние ошибки, которое могло бы быть скрытым кодом диагностики порождения для выполнения.
я отлаживал, отследил в обратном порядке, и считайте дизассемблирование. Это было исключение при обработке std::string
, возможно, индексации от конца.
ЦП большинства процессоров, изготовленных за последние 15 лет, имеют несколько специальных инструкций, которые являются очень мощными. Эти привилегированные инструкции сохраняются для приложений ядра операционной системы и не могут использоваться пользовательскими программами.
Это ограничивает ущерб, который может нанести написанная пользователем программа системе, и сокращает количество аварийных сбоев системы.