Предотвращение выполнения данных отслеживания (DEP)
Вопрос
При запуске одного из наших программ тестировщик столкнулся с диалоговым окном предотвращения выполнения данных в Windows.
Попробуем воспроизвести эту ситуацию на компьютере разработчика в целях отладки:безуспешно.
Кто-нибудь знает, как найти причину, по которой защита DEP убивает приложение?Существуют ли какие-либо существующие инструменты для этого?
Решение
Диалоговое окно DEP обычно отображается только при попытке выполнить код из региона, который вы не помечаете как исполняемый.Это может быть вызвано «переходниками» в используемой вами библиотеке, например.Окно ATL.Эта проблема исправлена в ATL 8.0.
Ошибка уничтожения стека — например, переполнение буфера — также может вызвать эту проблему, поскольку адрес возврата устанавливается в место, которое не является исполняемым.Это может вызвать не нарушение прав доступа, а странное поведение, если DEP отключен для процесса или недоступен на оборудовании.
Это также может произойти, если вы генерируете исключение C++ или исключение SEH, а ваши обработчики структурированных исключений были уничтожены из-за переполнения буфера.
Другие советы
Потенциально я думаю, что каждый раз, когда вы пытаетесь записать в нераспределенную память, это будет возможным результатом.Это может быть что угодно, например удаление объекта с последующим его использованием или запись строки в буфер, который слишком мал для ее хранения.
На DEP влияет наличие аппаратных возможностей.Недавно у нас возникла ситуация, когда наше приложение нормально работало на старых машинах, но не работало на новых.Оказалось, что хотя DEP был включен и на старых, и на новых серверах, на новых у нас произошел сбой, потому что обнаружение оборудования было лучше, агрессивнее или что-то в этом роде.Так что, если ваш тестировщик может воспроизвести, а разработчик не может, попробуйте сделать это на идентичном оборудовании...Хотя кажется необоснованным, что у QA будет более новый/лучший компьютер, чем у разработчика...Я полностью в это верю!
Вот мои заметки о нашем недавнем опыте в этом отношении:Несовместимость между Indy 9 и Windows Server 2003?