4

При сегодняшнем входе в Windows 7 мой компьютер мгновенно переходил на BSOD. Используя WhoCrashed, я получаю следующий отчет:

-

  • По вт 12.02.2013 13:56:20 GMT ваш компьютер сломался
  • файл аварийного дампа: C:\Windows\Minidump\021213-27390-01.dmp
  • время работы: 00:00:25
  • Вероятно, это было вызвано следующим модулем: ntoskrnl.exe (nt+0x1AA698)
  • Код ошибки:0x1000007E (0xFFFFFFFFC0000096, 0xFFFFF80003610698, 0xFFFFF8800614C7B8, 0xFFFFF8800614C010)
  • Ошибка: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
  • Путь к файлу: C:\Windows\system32\ntoskrnl.exe
  • продукт: операционная система Microsoft® Windows®
  • компания: корпорация Майкрософт
  • описание: NT Kernel & System
  • Описание проверки ошибки: Это указывает, что системный поток сгенерировал исключение, которое обработчик ошибок не перехватил.

Похоже, что это типичная ошибка программного драйвера и, скорее всего, не вызвана аппаратной проблемой. Сбой произошел в ядре Windows. Возможно, эта проблема вызвана другим драйвером, который не может быть идентифицирован в настоящее время.

-

Теперь мой компьютер иногда зависал / зависал и выполнял определенные задачи, требующие высокой производительности, но причиной этого (как мне казалось) был недостаток RAM-слота в моей материнской плате. Хранение этого слота пустым остановило сбои.

Сегодня снова произошел сбой, и я ничего не изменил, связанный с аппаратным обеспечением.

Я знаю, что мог бы обойти Google, читая, что означает этот код проверки на наличие ошибок, но в последнее время я осознал, что личный опыт кого-то (с той же ошибкой / проблемой) гораздо более полезен, особенно если этот человек мог прийти к решение.

Большое спасибо!

1 ответ1

10

В этом случае поток встретил исключение

C0000096: STATUS_PRIVILEGED_INSTRUCTION
          Executing an instruction not allowed in current machine mode.

Эта ошибка была вызвана самим процессором. Какой-то код пытался выполнить инструкцию, которая ему не разрешена. Вероятно, это вызвано повреждением памяти; где код ядра пытался выполнить ненужные данные.

Такого рода ошибки действительно невозможно точно определить. В коде "ядра" произошла ошибка, которая не должна была произойти. Крайне маловероятно, что в каком-либо коде Microsoft есть программная ошибка; когда вы начинаете искать в другом месте.

  • Сторонние драйверы. Диски режима ядра имеют полный доступ к физическому оборудованию. Любая случайная ошибка в любом стороннем драйвере (например, видео, звук, сеть, USB 3.0, SATA), и это может повредить код или данные чего-либо еще в системе. Следующие шаги: попробуйте удалить недавно добавленное оборудование (чтобы некоторые сторонние драйверы не загружались), попробуйте загрузку в безопасном режиме (чтобы некоторые сторонние драйверы не загружались) или переустановите Windows (чтобы не загружались некоторые сторонние драйверы)
  • Плохая RAM. Если бит был перевернут, и он превратил совершенно безобидную инструкцию в другую, недействительную инструкцию, вы можете получить эту ошибку. Следующие шаги: извлеките флеш-память, переместите ее в другие слоты, разблокируйте ее, поменяйте источники питания
  • Разгон. Иногда при разгоне могут произойти необычайно странные вещи. Надеюсь, что все отправляют Microsoft свои аварийные дампы; потому что Microsoft расследует их. Распространенная ошибка, которую они получают, это когда процессор выполняет инструкцию:

    xor eax, eax;
    

    Это чрезвычайно простая операция, которую может выполнить процессор; это просто установка внутреннего регистра процессора EAX на ноль. Нет никакого способа, которым это может потерпеть неудачу; кроме случаев, когда вы разгоняете - или другие физические проблемы.

tl; dr: Если вы удалили программное обеспечение, то это аппаратное обеспечение.

Обновление: методология устранения неполадок

я хотел упомянуть детали, которые я прошел, почти бездумно, глядя на эту ошибку.

Первым был сам код ошибки:

0x1000007E - SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M

Binging это на Google дает страницу документации Microsoft

Проверка на ошибку 0x1000007E: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M

Это указывает на то, что системный поток сгенерировал исключение, которое обработчик ошибок не перехватил.

Из опыта работы в качестве разработчика я знаю, что если мое приложение (или один из его потоков) сталкивается с "исключением", а я не «обрабатываю » исключение, Windows в конечном итоге обработает его, убив приложение. Если в режиме ядра происходит необработанное исключение, у ОС нет иного выбора, кроме как обработать его, выключив ядро. Что меня интересовало, так это то, какое исключение было выброшено. я предположил (неправильно, оказывается), что это было "нарушение прав доступа".

я знаю, что все баг-чеки сопровождаются четырьмя параметрами, которые описывают то, что на самом деле произошло:

  • Параметр 1: 0xFFFFFFFFC0000096
  • Параметр 2: 0xFFFFF80003610698
  • Параметр 3: 0xFFFFF8800614C7B8
  • Параметр 4: 0xFFFFF8800614C010

Но что, черт возьми, это значит ?! Вот когда мы вернемся к странице документации, которая не описывает их. Но это не говорит:

Проверка на ошибку 0x1000007E имеет то же значение и параметры, что и проверка на ошибку 0x7E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED).

Отлично. И эта другая страница документирует параметры:

SYSTEM_THREAD_EXCEPTION_NOT_HANDLED Параметры

Следующие параметры отображаются на синем экране.

  • Параметр 1: Код исключения, который не был обработан
  • Параметр 2: адрес, где произошло исключение
  • Параметр 3: адрес записи об исключении
  • Параметр 4: адрес контекстной записи

Это то, что я хотел, код исключения, который не был обработан. В вашем случае это был код исключения:

0xFFFFFFFFC0000096

по своему опыту я знаю, что вы работаете в 64-битной Windows, потому что этот код имеет 64-битную длину. На самом деле я хочу только младшие 32 бита:

0xC0000096

Обычно я ожидал найти этот код ошибки в winerror.h в моем каталоге разработки; но его там не было Это заняло немного Binging, но я обнаружил, что в поисках:

winerror C0000096

приведи меня на страницу на winehq, где объявлена константа:

STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096

Чтение этой константы привело меня к канонической странице документации Microsoft:

Аппаратные исключения

STATUS_PRIVILEGED_INSTRUCTION: Выполнение команды, запрещенной в текущем машинном режиме.

Я также знаю , что это исключение на самом процессоре. я знаю, что, поскольку "Привилегированная инструкция" означает, что вы пытались выполнить инструкцию ЦП, вам не разрешено. Я также могу знать это, потому что страница называется Аппаратные исключения.

Итак, мы подошли к моменту, когда выполнялся какой-то код, который пытался выполнить инструкцию процессора, которую он не должен был выполнять. Есть две возможности:

  • память была повреждена; программное обеспечение не было написано, чтобы попытаться выполнить этот код, но это то, что только что оказалось в оперативной памяти
  • это действительно глючная программа, и она пыталась сделать что-то, что не разрешено.

Учитывая, что код Microsoft постоянно тестируется в полевых условиях на миллионах машин каждый день, это более вероятно:

  • быть проблема с вашим оборудованием
  • ошибка в чужом коде, вызывающая проблемы

Во всяком случае, это было , как я работал над этой BugCheck. Может быть, зная, как я прошел через это, это может помочь вам в следующий раз, когда у вас будет баг-чек.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .