Безопасно ли ловить EXCEPTION_GUARD_PAGE - PullRequest
3 голосов
/ 17 июня 2010

Среда VC ++ 9 на различных платформах Win (XP и более поздних).

Я пишу обработчик необработанных исключений.У меня есть смутные воспоминания о том, что в дни моего ядра было плохо поймать EXCEPTION_GUARD_PAGE, так как это было сгенерировано, чтобы сообщить ОС об увеличении стека.

Мой вопрос состоит из двух частей:

  1. Может ли такое исключение произойти в пространстве пользователя?

  2. Если это так, безопасно ли его ловить?

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

__ Update: __

Я вспомнил свой источник, это блог Рэймонда Чена (http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx)

Моя первоначальная проблема заключается в том, что при перехвате всех исключений, если я поймаю EXCEPTION_GUARD_PAGE, я могу помешать ОСвидя исключение и увеличивая стек.

Если подумать, я подозреваю, что EXCEPTION_GUARD_PAGE может обрабатываться в ядре во время операции чтения / записи, которая его сгенерировала, и, таким образом, никогда не достигнет моего кода пользовательского пространства.

Мне кажется, я ищу кого-то, кто подтвердит (или опровергнет) это.

__ Второе обновление: __

Я еще не выбрал ответтак как никто не ответил на этот вопрос, я оставлю его открытым в надежде, что кто-то еще может предложить информацию, которую я ищу.

___ Третье обновление __

Все еще живв (слабой) надежде.

__ Четвертое обновление __

Ну, я так и не получил полезного ответа.Я давно закончил модуль, который писал, когда задавал вопрос.Я думаю, что вопрос для практических целей мертв.Я, вероятно, не буду обновлять снова.

Ответы [ 3 ]

3 голосов
/ 17 июня 2010

Настройка страницы для генерации STATUS_GUARD_PAGE_VIOLATION с VirtualProtectEx () и флагом PAGE_GUARD - это документированная процедура .Исключение может быть сгенерировано только один раз для страницы, поэтому нет опасности, что вы умрете при обработке исключения.

Я не делаю ничего особенного для исключения, но это не слишком доказывает, получая этоИсключение будет чрезвычайно редким.Никогда не видел это ни в одном из наших отчетов о сбоях.

Эта функция действительно предназначена для генерации исключений переполнения стека.Что вам действительно нужно обрабатывать специально, так как у вас осталось так мало стека.Я предполагаю, что именно отсюда пришло предупреждение, которое вы упомянули в своем вопросе.Однако он никогда не сгенерирует исключение для защиты страницы, которое обрабатывается на уровне ядра перед преобразованием в переполнение стека.

1 голос
/ 08 августа 2012

По моим наблюдениям с virtualquery, это похоже на случай режима ядра. Исключение может быть перехвачено отладчиком, если доступный стек защитной страницы не принадлежит потоку доступа. В любом случае, у вас уже должен быть ответ.

0 голосов
/ 17 июня 2010

Согласно MSDN :

Поток обращался к памяти, выделенной с модификатором PAGE_GUARD.

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

Редактировать

Обработчики исключений ОС регистрируются раньше ваших, поэтому обработка их самостоятельно не означает, что ОС не увидела ее первой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...