что означает «Попытка выполнить неисполняемый адрес»? - PullRequest
2 голосов
/ 01 августа 2011

Я вижу ошибку нарушения доступа в моем приложении c ++. При подключении windbg к процессу, когда происходит нарушение, и использовании! Analyse, я обнаружил, что нарушение прав доступа было связано с попыткой выполнить неисполняемый адрес. Я знаю адрес, который выполняется, который вызывает это. Что может привести к этой ошибке? Какая возможная ошибка в коде может привести к этому? Как мне эффективно отладить это?

Ответы [ 4 ]

2 голосов
/ 01 августа 2011

Две распространенные причины этой ошибки в C ++: 1) использование виртуальной функции неинициализированного / удаленного объекта и 2) использование указателя неинициализированной функции.В любом случае вы эффективно переходите на случайный адрес.Поскольку большая часть памяти не помечена как исполняемая, вы, скорее всего, будете остановлены «попыткой выполнить неисполняемый адрес»

1 голос
/ 01 августа 2011

Предотвращение выполнения данных описано здесь: http://msdn.microsoft.com/en-us/library/aa366553(v=vs.85).aspx. Возможный способ получить эту ошибку - переопределить адрес возврата функции в стеке.Итак, вам нужно проверить код, который выполняется непосредственно перед этим нарушением доступа.

1 голос
/ 01 августа 2011

Это не ошибка в коде.Это означает, что вы пытаетесь выполнить некодированную память, которая принадлежит хранилищу .data, например, объявление переменных или что-то иное, чем код.Это может быть вызвано неправильным указателем.

0 голосов
/ 02 августа 2011

Там нет серебряной пули для отладки этого.Как уже говорили другие, каким-то образом был запущен неисполняемый адрес.

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

Если вы можете выяснить, как передается это значение, вы сможете установить некоторые контрольные точки и следовать за значением до тех пор, пока оно не станет недействительным.Бинарный поиск - это хороший систематический способ устранения основных причин.

...