Подтвердить что ты не робот

В чем конкретно заключается ограничение доступа "0xc0000005"?

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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