Какова область действия нарушения прав доступа «0xc0000005»? - PullRequest
32 голосов
/ 14 марта 2011

Мне было интересно узнать об исключении 0xc0000005 и о том, что оно включает в себя.

т.е. Я так понимаю, это происходит, если приложение пытается получить доступ к освобожденной памяти / памяти, принадлежащей другому процессу.
Но как быть, например, с адресом, привязанным к оборудованию? Или адрес за пределами допустимого диапазона? Есть ли попытки доступа к этим ошибкам с помощью одного и того же кода или они имеют свои собственные? Включает ли это неудачное чтение действительных адресов, принадлежащих процессу?

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

(я знаю, что здесь должна быть страница MSDN, но поиск в Google или MSDN вызывает около 100 страниц поиска и устранения неисправностей случайных приложений;))

Спасибо!

Ответы [ 3 ]

36 голосов
/ 14 марта 2011

Вам нужно прочитать руководство по процессору, чтобы углубиться в это.Это вызвано "ловушкой", лучше всего описанной как исключение в процессоре.Ловушка прерывает выполнение кода и позволяет оператору системы «перехватывать» обработчик для устранения ошибки.Очень распространенным доброкачественным является сбой страницы, возникающий, когда процессор пытается прочитать данные из ОЗУ, которые еще не отображены.Вот как реализована виртуальная память.

AccessViolation относится к группе ловушек, которые являются серьезными ошибками, с которыми операционная система не знает, как обращаться.Это называется «Общая ошибка защиты» в руководстве по процессору.Это что-то вроде мешка, есть много способов вызвать GPF.Безусловно, наиболее распространенным является попытка чтения памяти, которая не отображается, обычно это происходит из-за повреждения памяти кучи.Затем следует попытка выполнить инструкцию машинного кода, которая недопустима или может быть выполнена только с помощью привилегированного кода, обычно вызванного повреждением стековой памяти.

Эти ловушки настолько же отвратительны, как и процессор, процессор просто не может продолжитьвыполнение программы.Операционная система, конечно, не знает, как с этим справиться, она вызывает исключение AccessViolation, чтобы дать программе шанс вернуть процессор к заведомо исправному коду.Это возможно при использовании ключевых слов __try/__except в вашем коде.Между прочим, это не очень хорошая идея, кроме как для пользовательских отчетов об ошибках, вы не представляете себе, как состояние вашей программы было изменено до ее смерти и, следовательно, нет способа восстановить ее.

Без такого обработчика SEH это заканчивается защитой, которую обеспечивает Windows.Вы можете предоставить свой собственный SetUnhandledExceptionFilter () , полезный для настройки отчета о сбое.Предоставляемая системой система положит конец этому, запустив WER, компонент Windows Error Reporting.Что в конечном итоге завершает процесс.

15 голосов
/ 15 марта 2011

Во-первых, вы должны понимать, что адреса в пользовательском режиме являются виртуальными адресами.Они не являются реальными адресами, используемыми для доступа к оборудованию.Скорее, в ЦП имеется схема преобразования виртуальной памяти в физическую (часть блока управления памятью), которая находит соответствующую запись в «буфере преобразования перевода».При каждом переключении контекста ОС заполняет TLB отображениями памяти, принадлежащими вашему процессу.

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

Если ваша программа получает доступ к адресу, который нигде не отображается, ловушка будет возникать как Ганссказал.Это та же самая ловушка для "сбоев страниц" и "нарушений доступа".Сначала ОС проверит, является ли адрес действительным, но не в TLB (например, на вашем компьютере не хватило памяти, а некоторые были выгружены на диск).В этом случае ОС переместит данные обратно в физическое ОЗУ, установит правильное отображение в TLB и продолжит выполнение вашей программы.Если ОС определит, что адрес полностью недействителен (с ним не связано ни одно место подкачки), она сгенерирует «нарушение доступа» (именование Windows) или «ошибку сегментации» (именование POSIX).

Обычнопричиной является логическая ошибка, но если у вас, например, произошел сбой ОЗУ, который немного изменился в одном из ваших указателей, сбой оборудования также может вызвать нарушение прав доступа.

1 голос
/ 14 марта 2011

Я получил это как мой первый результат за "нарушение доступа" (без кавычек) в Google. Я не уверен в специфике, но AV просто означает, что: процессор пытался читать или писать по определенному адресу, который его текущее состояние не позволило. Это может быть аппаратная проблема, ошибка шины, несоответствующая виртуальная память, плохой процессор; почти все, что указывает на нарушение защиты доступа.

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