Исключения и нарушения прав доступа в событиях Paint в Windows - PullRequest
4 голосов
/ 25 мая 2010

После выполнения какого-то нового кода мое приложение на C ++ начало вести себя странно (неправильные или неполные обновления экрана, иногда вообще никаких обновлений экрана). Через некоторое время мы узнали, что новый код вызывает нарушение прав доступа. Как ни странно, приложение просто продолжает работать (но с неправильными обновлениями экрана).

Сначала мы думали, что проблема была вызвана конструкцией «try-catch (...)» (поставленной там сверхактивным бывшим коллегой), но спустя несколько часов (тщательно проверяя стеки вызовов, добавляя множество точек останова, ...) мы выяснили, что если в событии рисования есть нарушение прав доступа, Windows перехватывает его и просто продолжает запускать приложение.

  • Это нормальное поведение?
  • Это нормально, что Windows перехватывает исключения / ошибки во время события рисования?
  • Есть ли способ отключить это? (если нет, это будет означать, что мы должны всегда запускаться в отладчике со всеми включенными исключениями при тестировании нашего кода).

EDIT:

  • В XP правильно вылетает (требуемое поведение после нарушения прав доступа)
  • В Vista и Windows 7 приложение продолжает работать

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Это известный дефект. Проверьте исправление. http://support.microsoft.com/kb/976038

2 голосов
/ 25 мая 2010

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

[Я удалил оставшуюся часть предыдущего ответа, потому что, основываясь на комментариях Патрика и небольшом расследовании, он был явно неприменим к рассматриваемой проблеме. ]

После комментария Патрика я провел быструю проверку и продублировал поведение под Windows 7. Я начал с действительно минимальной программы (базовая программа, сгенерированная VS 2008 для проекта Win32) и все Я добавил запись на несуществующий адрес. Конечно же, вы не получите никаких признаков того, что случилось что-то плохое.

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

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

...