Общая ошибка защиты - PullRequest
3 голосов
/ 11 мая 2010

Как определить процесс, вызвавший GPF?

1 Ответ

1 голос
/ 11 мая 2010

Я не уверен, что понимаю ваш вопрос. GPF - это ситуация, когда процессор выдает прерывание.

Если это происходит в пользовательском режиме - это переводится в исключение SEH, которое, в свою очередь, может обрабатываться процессом. Если это не обработано - процесс "вылетает". Означает - отображается некрасивое окно сообщения, и процесс завершается (в зависимости от настроек процесс также может быть отлажен, сгенерирован дамп отладки и т. Д.)

ЕСЛИ это происходит в режиме ядра - есть две возможности. Если это произошло в контексте, где допускаются исключения - исключение SEH возникает и обрабатывается (аналогично режиму пользователя). Однако если исключение не обрабатывается или контекст, в котором произошел GPF, не допускает исключений - ОС выключается, отображая так называемый BSOD (синий экран смерти).

Теперь по вашему вопросу я вижу несколько возможностей:

  • ОС умирает, и вы хотите знать, какой процесс сделал системный вызов, который вызвал GPF в режиме ядра. Это можно обнаружить с подключенным отладчиком ядра. Вы также увидите драйвер, вызвавший ошибку.
  • GPF происходит в пользовательском режиме внутри процесса и не обрабатывается. Этот процесс завершится сбоем, и вы точно будете знать, что это был за процесс.
  • GPS происходит внутри процесса, обрабатывается, и процесс продолжает выполняться. И вы хотите получать уведомления об этом. Для этого вы можете присоединиться к процессу с помощью отладчика. Всякий раз, когда возникает исключение SEH внутри процесса - отладчик уведомляется ОС.
...