Критическая ошибка, она же более известна как «синий экран смерти», всегда влечёт за собой определённые последствия, так как её возникновение свидетельствует о том, что в работе операционной системы возникли серьёзные неполадки. Каждый пользователь, являющийся оператором компьютера, так или иначе, но сталкивался с проявлением подобной проблемы и знает, что далеко не всегда её решение лежит на «поверхности». Порой для исправления возникшей ситуации приходится прибегать к крайним мерам – это фактическая переустановка операционной системы Windows. Стоит ли применять данный способ в решении рассматриваемой в настоящей статье ошибки, в чём заключаются причины её возникновения. Обо всём об этом вы сможете прочитать ниже.
Исправление ошибки Access violation.
Причины и решения
Такой универсальный вариант (переустановка ОС) уже давно является наиболее рекомендуемым на различных IT-форумах, а также некоторыми «специалистами» воспринимается как «панацея» от любых проблем, что, конечно же, не отвечает действительности. Да, справедливости ради стоит отметить, что полная чистая переустановка Windows практически гарантированно решит имеющиеся программные проблемы, но ни в коем разе не аппаратные. Поэтому не стоит спешить «сносить» операционную систему, для начала следует определить причинно-следственную связь и только после этого принимать подобные кардинальные решения. Итак, рассматриваемая ошибка «Access violation» сигнализирует о том, что какой-либо процесс при обращении к нужному ему типу памяти встречается с трудностями. Например, при запуске игрового программного обеспечения процесс пытается обратиться не к свойственному ему типу памяти, вызывая при этом упомянутую выше ошибку, которая сопровождается текстовым сообщением в виде «Access violation at address № in module «…dll. Write of address…».
Причин возникновения подобной ситуации может быть очень много, что серьёзно усложняет определение причинно-следственной связи, поэтому и применяемые методы носят комплексный характер, а именно:
- Проведите полную проверку операционной системы на наличие вирусной активности. Не прибегайте исключительно к услугам штатного антивируса, а обратите своё внимание на сторонние утилиты, к примеру, «DoctorWeb Curelt», «Malwarebytes» и «Adwcleaner». Проверьте всё тесно связанное с работой компьютера, включая внешние устройства хранения информации, которые подключались ранее к компьютеру, так как не исключено, что основная «зараза» засела именно там.
- Проверьте операционную систему на целостность компонентов, для этого:
Процесс сканирования и внесение правок может быть продолжительным, но прерывать функционирование утилиты не рекомендуется. Дополнительно после завершения работы «sfc/scannow» можно обратиться к помощи команды «dism.exe /online /cleanup-image / restorehealth», инициировать работу, которой можно с помощью той же командной строки.
- Также будет не лишним проверить используемые жёсткие диски и/или твердотельные накопители и наличие битых секторов, ошибки. Для этого подойдёт хотя бы штатная утилита «CHKDSK».
Вышеизложенные рекомендации носят обобщённый характер, так как их применение обосновано не только при возникновении каких-либо проблем в работе операционной системы, но и как профилактические меры по поддержанию качества функционирования Windows. Если ошибка не нашла своего решения и продолжается «терзать» пользователя, то следует прибегнуть к более точечным проверкам, которые заключаются в следующем:
- «Проверка реестра»:
Также будет не лишним прибегнуть к функционалу программы «CCleaner» для проверки реестра на ошибки. Основную проблему это может не решить, но добиться улучшения общего состояния операционной системы вполне реально.
- «Проверка корректности используемого драйверного обеспечения». Откройте «Диспетчер устройств» и удостоверьтесь, что все компоненты полностью работоспособны и среди них нет неизвестного устройства, которое было бы помечено жёлтым треугольником с восклицательным знаком внутри. Дополнительно можно обратиться к специализированному софту и проверить актуальность всех используемых драйверов.
- «Проверка качества работы программного обеспечения». Если рассматриваемая проблема проявилась при открытии какой-либо программы или игры, то попробуйте полностью удалить их и установить заново, но удостоверившись в том, что возможности вашего компьютера, а также версия операционной системы соответствует техническим требованиям продукта. Если игра была получена не совсем «честным/законным» путём, то попробуйте скачать другой репак или сменить основной источник. Если вы уверены в том, что вирусного программного обеспечения нет и проблема проявляется в отдельно взятом программном обеспечении при любых манипуляциях с ним, то можно попробовать внести данное ПО в список исключения DEP, для этого:
Перезагрузите компьютер и проверьте качество работы Windows и работоспособность нужной вам программы/игры.
Заключение
К сожалению, как видно из всего представленного выше, в рассматриваемой ошибке нет каких-то конкретных причин возникновения. «Access violation», как и её собратья, является лишь следствием каких-либо сбойных моментов в работе Windows, поэтому и все приведённые рекомендации направлены на восстановление штатной работы OS. Всё сказанное в начале про переустановку Windows таковым и остаётся и в завершении статьи.
Примечание для людей, заходящих сюда из поисковика: эта статья написана для разработчиков программ. Если вы не программист и не пытаетесь исправить ошибку в СВОЕЙ программе, эта статья — не для вас. До свидания. Извините, что потратил ваше время.
Примечание для студентов/новичков, пишущих на Delphi/C++ Builder: эта статья написана для диагностики исключений в вашей программе. Если вместо этого вы получаете ошибки от самой IDE (а не от вашей программы), например, access violation в пакете dclite60.bpl, то эта статья — не для вас. Чтобы решить проблемы с IDE — идите сюда. Краткий ответ: не надо использовать динозавров (Delphi 5/6/7), используйте современные IDE (Delphi XE и выше). Если всё же хочется динозавров, то часто причиной является DEP. Т.е. нужно добавить Delphi/Builder в исключения DEP. Ну или на крайний случай — отключить/удалить конфликтующий пакет.
Итак, для всех прочих (а именно: разработчиков Delphi/C++ Builder, пытающихся решить проблему возникновения исключения Access Violation в своей программе) — приступим!
Исключение класса EAccessViolation
— это самое частое исключение в Delphi-программах. Я хотел бы рассмотреть, что это такое, когда возникает, и как с ним бороться. Этот пост скорее для начинающих, поэтому данные могут излагаться с упрощением.
Примечания:
- если вы совсем начинающий или студент/студентка и получили Access Violation — первым делом включите опцию Range Check Errors (Project/Options, вкладка Compiler) и сделайте Project/Build.
- если вы плохо или совсем не понимаете, что такое указатели и/или объекты — рекомендую сначала прочитать эту статью.
- если вы плохо или совсем не умеете работать с отладчиком IDE (или даже не знаете, что это такое) — прочитайте сначала эту статью.
Каждая программа использует при работе память (*). Память занимает любая переменная в вашей программе. Будь это форма, компонент, массив, запись, строка или же простой Integer
. Под некоторые переменные память выделяется автоматически (например, под переменные типа Integer
и статические массивы), под другие — вы должны выделять её сами, явно (например, динамические массивы). Собственно, с точки зрения операционной системы каждая переменная характеризуется адресом в памяти (местоположением) и размером. Понятно, что обычно данные разных переменных не пересекаются — за исключением случаев обращением к одной области памяти через разные имена с помощью указателей.
Грубо говоря, обычно в программе используется три типа памяти: область памяти для глобальных переменных, стек и куча.
Память для глобальных переменных выделяется загрузчиком ОС при загрузке исполняемого модуля программы в память и освобождается при выгрузке модуля (выходе из программы). Глобальные переменные — это любые переменные, объявление которых располагается вне класса или процедуры. Стек используется для размещения локальных переменных (объявленных в процедуре/функции) и служебных данных (типа адресов возврата и адресов обработчиков исключений). Куча же используется для размещения динамических данных.
Подробнее.
Заметим, что для переменных динамических типов данных (динамические массивы, строки, любые объекты, компоненты), хотя сама переменная может размещаться в области для глобальных переменных или в стеке (а, значит, память для неё выделяется автоматически), но данные, на которые она указывает, всегда размещаются в куче и, зачастую, должны управляться вручную.
Вне зависимости от того, кто выделяет память для переменной (вы вручную или компилятор автоматически), память для любой переменной должна быть выделена перед использованием, а потом, когда переменная уже не будет нужна — освобождена.
Иногда из-за ошибок в коде программы происходит ситуация, когда программа при выполнении пытается получить доступ к памяти, которая не была выделена или уже была освобождена. Когда такое происходит, процессор возбуждает исключение класса EAccessViolation
. Обычный текст ошибки в приложении Delphi — «Access violation at address XXX in module ‘YYY’. Write/read of address ZZZ» («Нарушение доступа по адресу XXX в модуле ‘YYY’. Попытка записи/чтения в ZZZ»). Хотя причина этого исключения всего одна (попытка обращения к недействительной памяти), но эта ошибка может проявлять себя в весьма разном виде и коде.
Более подробно об указателях и памяти говорится в уже упоминавшейся выше статье.
Ищем место возникновения Access Violation
Как, собственно, бороться с этими ошибками? Ну, если вы получили EAccessViolation
под отладчиком:
То нужно просто нажать на «Break» («Ok» в старых версиях Delphi) и отладчик сразу же ткнёт вас на строчку с ошибкой. Также можно посмотреть стек вызовов (в меню Delphi — View/Debug windows/Call Stack):
В этом окне будет показано, как же вы туда попали. Читается это дело сверху вниз (текущее место помечено стрелочкой). Можно дважды щёлкать по строкам в этом окне для перехода в код, соответствующий этой строке.
Иными словами, отладчик сразу же тыркает вас в строку с ошибкой.
Если же вы используете средства автоматической диагностики типа EurekaLog/madExcept, то вместо обычного сообщения об ошибке вы получите баг-отчёт, в котором будет виден тот же самый Call Stack (вид стека вызова может отличаться из-за различных методов его получения):
Не имеет значения, столкнулись ли вы с проблемой во время отладки или получили баг-отчёт от EurekaLog для уже распространяемой программы — хорошо бы подготовиться к этой ситуации заранее и включить опции проекта, упрощающие отладку. Как правило, это опции «Use Debug DCUs» и «Stack frames».
Окей, найти место ошибки — это только пол-дела. Определить почему же в этой строке возникла ошибка — это вторые пол-дела.
Ищем причину возникновения Access Violation анализом кода
Если ситуация возникла у вас в отладчике, то тут всё относительно просто: вам нужно установить точку останова на проблемную строчку и проверить значения всех переменных и выражений, участвующих в ней — вот вам и причина ошибки, находится сразу же. Я не буду подробно останавливаться на теме отладки здесь, более подробно об этом написано в моей статье, часть 2 (осторожно: большой размер).
В случае, если у вас на руках есть только баг-репорт, а не ситуация под отладчиком, то вам придётся использовать свои телепатические способности, которые обычно развиваются с опытом. Дабы помочь вам в этом, здесь я как-раз и хочу рассмотреть типичные причины возникновения ошибки Access Violation.
1. Во-первых, это всевозможные ошибки выхода за границы массивов. Например, типичная ошибка новичка может выглядеть так:
var X: Integer; ... for X := 1 to Length(List) do // ошибка! Должно быть: for X := 0 to Length(List) - 1 do begin // ... делаем что-то с List[X] end;
Если в вашей проблемной строке есть скобочки типа [], то у вас есть хороший довод к проверке допустимости выражения в [].
Обычно такие ошибки нужно отлавливать на стадии отладки, включая опцию Range Check Errors. Дело в том, что подобные ошибки весьма опасны тем, что могут пройти незамеченными (и потом редко ловятся при эксплуатации программы), даже более того — они могут разрушить стек, так что нельзя будет получить место возникновения ошибки. Но об этом позже.
2. Различного рода неверные передачи параметров. Обычно эти ошибки отлавливаются во время разработки и тестирования, нежели во время эксплуатации программы. Чаще всего они возникают при использовании процедур с нетипизированными параметрами. Сюда же относятся различные варианты ошибок переполнения буфера, например:
var S1: array of Integer; S2: String; ... // Неверно: Stream.ReadBuffer(S1, 256); // портит указатель S1 // Правильно: Stream.ReadBuffer(S1[0], 256); // читает данные из потока в массив // Неверно: FillChar(S2, Length(S2), 0); // портит указатель S2 // Правильно: FillChar(Pointer(S2)^, Length(S2), 0); // очищает строку, забивая её данные нулями
Для избавления от таких ошибок нужно просто внимательно изучать документацию на функции: что они ожидают увидеть и что вы действительно им подсовываете.
3. Передачи данных между двумя менеджерами памяти. Обычно ошибки такого плана возникают при передаче данных из DLL в приложение или наоборот. а также между двумя DLL. Чаще всего новички любят передавать из/в DLL строки типа String
.
Причины этого я рассматривал ранее. Эти ошибки обычно отлавливаются немедленно во время разработки программы и очень редко доживают до рабочей программы. Решаются эти проблемы правильным проектированием.
4. Неверное объявление функций, импортируемых из DLL. Наиболее часто путают модель вызова. Если у вас получается EAccessViolation
при вызове функции из DLL — просто внимательно посмотрите на её объявление и убедитесь, что её сигнатура верна — чаще всего пропускают модель вызова, stdcall
или cdecl
.
Хотя обычно ошибки такого плана отлавливаются на этапе разработки, тем не менее могут быть ситуации, когда ошибка проползает в готовую программу. Вот увлекательная история Реймонда Чена о том, как программа может работать с неверно объявленным прототипом функции (довольно интересны и посты в серии до и после этого).
5. Отсутствие синхронизации при работе с потоками. Если вы делаете программу с использованием нескольких потоков, то у вас могут быть проблемы, если вы не обеспечили необходимой синхронизации. Например, любые обращения к VCL запрещены из вторичных потоков — вам нужно использовать Synchronize
. Собственно, проблемы тут возникают, когда один поток меняет данные с которыми работает второй поток — что для последнего становится полной неожиданностью.
К сожалению, ошибки с синхронизацией потоков наиболее тяжело диагностировать. Лучшее, что вы можете сделать — прогарантировать, что такие проблемы никогда не возникнут: используйте Synchronize
и/или заключайте код в критические секции при работе с разделяемыми потоками переменными. Иногда проблемы возникают из-за использования CreateThread
вместо BeginThread
или TThread
(из-за отсутствия установки IsMultiThreaded
).
6. Вызовы функций или процедур по процедурной переменной, когда она содержит неверное значение. Например:
var Lib1, Lib2: HMODULE; Proc: procedure; ... Lib1 := LoadLibrary('MyDll.dll'); // один код загрузил библиотеку. Быть может - другой поток ... Lib2 := GetModuleHandle('MyDll.dll'); Proc := GetProcAddress(Lib2, 'MyProc'); // нет проверки на ошибку. Функции может не быть - тогда Proc будет равна nil Proc; // Proc может быть равна nil - будет Access Violation ... FreeLibrary(Lib1); // ещё какой-то код выгрузил библиотеку ... Proc; // хотя Proc <> nil, код, на который она указывает, // больше не загружен - здесь будет AV.
Ситуация очень сильно напоминает следующий пункт и бороться с нею нужно такими же методами.
7. Вызовы методов или любые другие обращения к объектам или компонентам, которые ещё не созданы или же были уже удалены. Подозревать эту причину нужно, когда в проблемной строке у вас участвует переменная-объект или компонент. Особенно, если вы хоть где-то в программе занимаетесь ручным созданием или освобождением компонентов или объектов.
Проблема в том, что при освобождении компонента, его ссылка-переменная не меняется, продолжая указывать на уже удалённую память. Кроме того, локальные переменные не инициализируются автоматически при входе в процедуру и содержат мусор. Вот пример подобного рода ошибок:
var Str: TStringList; ... Str.Add('S'); // Ошибка! Мы забыли создать объект вызовом Str := TStringList.Create; ... Str := TStringList.Create; Str.Add('S'); ... Str.Free; // Здесь мы удалили объект, но ссылка Str по-прежнему указывает на ту же область памяти ... if Str.Count > 0 then // Ошибка! Обращение к уже удалённому объекту
Как мы уже говорили ранее, в приложениях Delphi есть служебный код, называемый «менеджером памяти», который отвечает за выделение и освобождение памяти в вашей программе и служит прослойкой между низкоуровневыми функциями операционной системы и вашим кодом. При всей своей пользе менеджер памяти, однако, добавляет в программу одну проблему: из-за него в программе находится куски памяти, которые выделены с точки зрения операционной системы, но свободны с точки зрения программы. Например, удалили вы компонент, но менеджер памяти не отдаёт память системе немедленно, придерживая её для дальнейшего использования.
Поэтому все ошибки доступа к памяти опасны в первую очередь тем, что могут пройти незамеченными. Например, мы обращаемся к уже удалённому объекту, но поскольку менеджер памяти ещё не отдал эту память системе, то обращение может пройти успешно. Чуть ранее мы говорили, что для предотвращения таких ситуаций вам нужно использовать FreeAndNil
и другие механизмы. Ситуация ещё хуже с локальными массивами: дело в том, что локальные массивы размещаются в стеке, в котором обычно есть довольно большие участки размещённой памяти по краям массива. Что ещё хуже, эта память обычно реально используется программой (в отличие от памяти, которую мы освободили при удалении объекта), так что вы можете, спокойно промахнувшись, записать что-то не туда, и в итоге, ошибка всплывёт в совершенно другом месте из-за испорченных данных. Чтобы сделать ситуацию ещё хуже: в стеке хранятся и служебные данные программы, необходимые для её выполнения — это адреса возврата и обработчики исключений.
Например:
procedure TForm13.Button1Click(Sender: TObject); var S: array [0..1] of Integer; I: Integer; begin I := 2; // предположим, что это значение как-то вычисляется и // из-за ошибки в программе получает неверное значение S[I] := 0; // эта строка затрёт адрес возврата из Button1Click в стеке end; // в этой строке произойдёт Access Violation, т.к. мы испортили адрес возврата procedure TForm13.Button2Click(Sender: TObject); var S: array [0..1] of Integer; I: Integer; begin I := -6; // пусть мы снова ошиблись в I try S[I] := 1; // вместо массива мы стираем обработчик исключений, установленный try S[I + 1] := 2; S[I + 2] := 3; Abort; // полный вылет программы, т.к. менеджер исключений обнаружил испорченный стек except ShowMessage('Aborted'); end; end; procedure TForm13.Button3Click(Sender: TObject); var S: array [0..1] of Integer; I: Integer; begin I := -1; // пусть мы снова ошиблись в I S[I] := 1; // хотя мы снова портим стек, но нам это сходит с рук // никакого EAccessViolation не будет вовсе! end;
Весьма коварные ситуации, не правда ли? В зависимости от того, как именно мы ошибёмся в индексе массива, мы можем получить (**):
а). Программу, выдающую правильные результаты.
б). Программу, выдающую неверные результаты.
в). Программу, возбуждающую исключение.
г). Программу, вылетающую вообще.
Причём одна и та же программа с таким багом может показывать любое из этих поведений, смотря по тому, на какой машине она запущена и в каких условиях/окружении выполняется.
Вот почему чрезвычайно важно использовать опцию Range Check Errors во время разработки и тестирования.
Ну, вы можете также включить её и для release-версии кода, если не уверены в качестве своей стадии тестирования.
Итак, что, собственно, нужно сделать, когда мы получили Access Violation? Ну, с помощью предыдущего пункта мы находим строку с ошибкой, а дальше пытаемся по пунктам подставить возможные причины:
— Есть в строке []? — подумаем, а не может ли у нас быть неверный индекс?
— Есть работа с объектами? Проследим, какова логика работы — не удаляется ли объект раньше времени?
— Используем DLL? А правильно ли объявлена функция? А уж не обмениваемся ли мы динамическими данными (строками, там, массивами)?
и т.д.
Существенную помощь в таком анализе нам поможет следующий пункт.
Ищем причину возникновения Access Violation анализом данных
Во-первых, мы можем попытаться вытащить информацию из самого сообщения об ошибке. Напомним его вид:
Access violation at address XXX in module ‘YYY’. Write/read of address ZZZ.
Во-первых, адрес XXX указывает на точное место в программе, где произошла ошибка. Именно по этому адресу отладчик Delphi и EurekaLog ищут строчку для показа её вам. Также модуль, которому она принадлежит, показывается в сообщении как YYY. Обычно это ваша программа, DLL или системная DLL. Однако, иногда это может быть и совершенно левое значение. Например, если в сообщении не указан модуль или значение XXX выглядит подозрительно (меньше $400000
или больше $7FFFFFFF
), то у вас либо проблемы с перезаписью стека (пункт «в» в конце предыдущего раздела), либо вызов неверной функции (пункт 6 или, иногда, 4 из предыдущего раздела).
Следующий полезный кусок информации — это слово «write» или «read». Первое означает, что возникла проблема при записи информации, второе — что проблема была при чтении. Соответственно, вам нужно проверять в строке кода либо операции записи, либо операции чтения. Например, если проблемная строка была «P := W;
«, то вам нужно обратить внимание на P
, если в сообщении стоит «write». Если же там стоит «read», то нужно проверять, что же у нас с W
.
И последний кусок информации, который можно извлечь из сообщения — это ZZZ. Собственно, точное значение нас обычно не волнует. Важен только факт — велико оно или мало. Мало — это что-то типа $00000000, $0000000A, $00000010
и т.п. Большие значения — это, например, $00563F6A, $705D7800
и др. Если ZZZ мало, то у вас идёт обращение по ссылке равной nil
. Если оно велико, то у вас идёт обращение по ненулевой, но мусорной ссылке. В первом случае вам нужно искать, зачем же вы полезли по ссылке равной nil
(или кто же освободил переменную раньше времени), во втором случае вам нужно понять, кто же это такой освободил объект, а ссылку не занулил. Короче говоря, это значение (так же, как и с «write»/»read») помогает сузить область поиска.
Помимо сообщения, если у вас есть баг-репорт, вы можете проанализировать значения регистров и состояние памяти. В этом вам помогут две последние вкладки в отчёте EurekaLog:
На первой вкладке вы можете видеть ассемблерный листинг своей программы. Приводится он здесь только для удобства — чтобы не надо было лезть ещё куда-то, чтобы подсмотреть его. Никакой информации он не несёт. А вот на второй вкладке вы можете видеть состояние регистров, (части) стека и (части) памяти в момент исключения. В данном случае мы смотрим на ассемблерный листинг и видим, что в проблемной команде участвуют регистры eax
и edx
. По вкладке CPU мы находим, что eax
равен 0
, что означает, что мы пытаемся присвоить значение по указателю, равному nil
. Взглянув на строчку исходника, которую мы узнали из стека вызовов, мы узнаем имя переменной. Вот вам и причина: переменная оказалась равна nil
.
Конечно, эта работа с такой информацией требует минимального знания ассемблера, но зато и является довольно мощным инструментом.
В следующий раз мы поговорим о ситуациях, когда у вас в коде есть ошибка, но никакого исключения не возбуждается. Частично мы уже говорили об этом здесь (например, пункт «1» и пункты «а»-«б» в конце второго раздела). Но в следующий раз мы пойдём чуть дальше и посмотрим, что ещё можно сделать для отлова таких ситуаций. И, в любом случае, у вас всегда есть возможность переписать код
Читать дальше.
См. также: как читать баг-отчёты.
Примечания:
(*) Очень подробно о памяти для приложений рассказывает Марк Руссинович.
(**) Вот ещё один пример, как один и тот же код может демонстировать широкий диапазон поведений.
Любое обновление, будь то обновление операционной системы или программного обеспечения несёт в себе потенциальный риск, обусловленный наличием в пакете апдейта мелких багов, которые могли пройти мимо внимательного взгляда разработчика. В таких случаях за допущенные ошибки расплачиваться обычно приходится пользователям, когда установленное или обновлённое программное обеспечение начинает работать некорректно. В качестве примера последствия бага в обновлениях можно привести ошибку STATUS ACCESS VIOLATION с кодом 0xc0000005, столкнуться с которой не так давно пришлось многим пользователям браузеров Google Chrome и Microsoft Edge.
Также появление ошибки было отмечено при запуске компьютерных игр DayZ и Arma 3, только при этом в описании обычно ещё указывается участок памяти, который не мог быть прочитан и динамическая библиотеке, к которой обращался игровой процесс. Так как разработчики Google и Microsoft уже выпустили патчи для своих браузеров, вероятность получить ошибку STATUS ACCESS VIOLATION невелика, если же вам всё же доведётся с ней столкнуться, попробуйте воспользоваться этими решениями, возможно, какое-то из них поможет вам устранить возникшую неполадку.
Переименование исполняемого файла Chrome или Edge — несколько необычное, но действенное решение, позволяющее устранить ошибку STATUS ACCESS VIOLATION. Тут всё просто — переходим в Проводнике в папку %ProgramFiles(x86)%\Google\Chrome\Application или %ProgramFiles(x86)%\Microsoft\Edge\Application (в зависимости от браузера) и переименовываем исполняемый файл chrome.exe или msedge.exe. Затем создаём на него ярлык на рабочем столе, запускаем браузер и смотрим, исчезла ли ошибка.
Если вы используете тестовую, так называемую канареечную версию браузера или у вас отключено автоматическое обновление, скачайте и установите стабильную актуальную версию обозревателя. Бета-версию удалять необязательно, а вот препятствующие нормальному обновлению стабильных версий Chrome или Edge твики отменяем.
Не исключено, что ошибка была вызвана одним из сторонних расширений. Перейдите по внутреннему адресу chrome://extensions (в Chrome) или edge://extensions (для Edge), отключите все расширения и проверьте, станет ли появляться ошибка. Если нет, последовательно включайте одно расширение за другим, чтобы найти таким образом проблемное, а когда найдёте, удалите его.
Сброс конфигурации обозревателя — относительно жёсткий способ исправления проблем с браузером, при этом отключаются расширения, удаляются все временные файлы и сбрасываются настройки домашней страницы. Чтобы выполнить сброс в Chrome, переходим в браузере по адресу chrome://settings/resetProfileSettings?origin=userclick, для сброса параметров Edge заходим на страницу edge://settings/resetProfileSettings и жмём кнопку сброса.
Более универсальным способом обхода ошибки STATUS ACCESS VIOLATION является отключение функции предотвращение выполнения данных (DEP). Откройте настройки DEP командой systempropertiesdataexecutionprevention, активируйте радиокнопку «Включить DEP для всех программ и служб, кроме выбранных ниже», нажмите кнопку «Добавить» и укажите путь к исполняемым файлам программ или игр, при запуске которых возникает ошибка STATUS ACCESS VIOLATION.
К сожалению, данный способ не подходит для Chrome и Edge, но с некоторой долей риска вы можете отключить предотвращение выполнения данных глобально, выполнив в запущенной от имени администратора командной строке команду bcdedit.exe /set {current} nx AlwaysOff. Соответственно, чтобы включить DEP, параметр AlwaysOff нужно заменить на AlwaysOn.
1. Добавьте игру, особенно если она нелицензионная, в исключения антивируса.
2. Если ошибка возникала при запуске игры DayZ, удалите одноименную папку игры из каталога «Документы», зайдите в Steam, откройте свойства игры и на вкладке «Общие» нажмите «Установить параметры запуска» и введите в поле напротив -nocharmenu.
3. Проверьте оперативную память на предмет ошибок с помощью штатной утилиты mdsched или сторонней утилиты Memtest86.
4. Выполните откат к системной точке восстановления.
Contents
- What Does Access Violation Mean on Windows 10?
- How to Resolve the Exception Access Violation Error on Windows 10
- Perform a Malware Scan
- Update Windows
- Add Data Execution Prevention Exception
- Disable User Account Control
- Make Sure the Affected Software Isn’t Set as Read-only
- Run the Problematic Program in Compatibility Mode
- Run the System File Checker and DISM Tools
- Check Your RAM for Corruption
- Create an options.ini file
- Troubleshoot Your Hardware
- Reinstall the Problematic Software
- Conclusion
Some software programs may not launch normally if your computer has corrupted software or memory. Anytime your access is denied, you will usually receive an access violation error, which usually reads, “Exception_Access_Violation.” In most cases, it comes with an error code or address.
Malware infections and faulty hardware may cause the Exception_Access_Violation issue. Improper file settings and compatibility errors may also result in the problem.
If you’re looking for ways to fix the Exception_Access_Violation error on Windows 10, this article will help you.
What Does Access Violation Mean on Windows 10?
“Access Violation at Address” errors can happen on every version of Windows, including Windows 10. If you see this message, it means the software you’re trying to run is attempting to access a protected memory address. It appears in the form of a pop-up window that prevents PC users from using particular programs.
The error could also be showing up due to a faulty system file, malfunctioning hardware, or malware infection.
The thing is, the Exception Access Violation error almost always occurs in any application. Many users have reported encountering the issue while running JAVA, Visual Studio, and antivirus applications. It even appears while operating certain games such as World of Warships, Overwatch, and Minecraft.
How to Resolve the Exception Access Violation Error on Windows 10
Perform a Malware Scan
If your computer is heavily infected with malware, it can corrupt your memory system and cause this error to appear. You should perform a thorough and detailed security scan if you have noticed suspicious behavior on your computer.
Occasionally, the Windows built-in antivirus software may not find anything. So, you might want to try another option such as Auslogics Anti-Malware. This tool can identify a potential malware infection that was ignored by your primary antivirus.
If malware isn’t the problem, we recommend scanning your system using a PC optimization tool such as Auslogics BoostSpeed. BoostSpeed’s cleaning module is designed to clean all types of PC junk. It safely removes temporary system and user files, problematic system files, leftover Windows Update files, temporary Sun Java files, and other elements that may slow down your PC and cause many issues.
Some registry anomalies, such as empty keys, do not typically pose any issues until they accumulate over time. They can become extremely complicated, rendering your computer useless. This is why we recommend using the Registry Cleaner in BoostSpeed. Experts consider it one of the safest tools for eliminating all those annoying glitches and crashes once and for all.
Update Windows
Updating Windows can resolve the “Access Violation at Address” issue by providing bug fixes, security patches, and updated system files that might solve compatibility issues or repair problematic system files causing the error.
Here’s a detailed step-by-step guide on how to update Windows 11:
1. Open the Settings app:
a. Press the Windows key or click the “Start” button.
b. Click on the “Settings” icon, which looks like a gear, to open the Settings app.
2. Access the Windows Update settings:
a. In the Settings app, click on the “Windows Update” tab located in the left-hand pane.
b. You should now see the Windows Update settings on the right-hand pane.
3. Check for updates:
a. Click the “Check for updates” button. Windows will start searching for available updates.
b. If there are updates available, Windows will automatically begin downloading and installing them. This process may take some time, depending on the number of updates and your internet connection speed.
4. Review optional updates (if applicable):
a. Click on “Advanced” and select “Optional Updates.”
b. Here, you can see and select additional updates, like driver updates or non-critical feature updates. Check the boxes next to the updates you wish to install.
c. Click the “Download and install” button to begin the installation process.
5. Restart your computer:
a. After the updates have been installed, you may be prompted to restart your computer to apply the changes. Save any open work and close all programs.
b. Click on the “Restart now” button or follow the on-screen instructions to restart your computer.
Follow these steps to update Windows 10:
- Open the “Settings” app and click on “Update & Security.”
- Click on “Check for Updates” under the “Windows Update” page.
- Click on “View Optional Update” to select “Feature, Quality, and Driver Updates”, depending on your preference.
- Allow the update client to download and install the updates. You may be required to restart your computer to complete the process.
Sometimes installed Windows Updates can cause issues. If you’re experiencing any update-related glitches, follow these tips.
Add Data Execution Prevention Exception
It’s possible to add the problematic program to a data execution prevention exception list if there’s no malware on your computer. This will let you run the program regardless of the “Access Violation at Address” error.
- Input “Control Panel” (without the quotes) in your Windows Search bar and launch the app.
- Scroll down and click on “System.”
- In the left pane, click on “Advanced System Settings.”
- Follow these steps to open the “Advanced System Settings” dialog in Windows 11: a) Open the “Settings” app, scroll down under “System”, and click on “About”. b) Click on “Advanced System Settings” under the “About” page.
- In the “Advanced tab”, click on “Settings” under the “Performance section.”
- In the “Performance Options” window, click on the “Data Executive Prevention” tab.
- Tick the “Turn on DEP for all programs and services except those I select” option, then click on the “Add” button and find your program’s .exe file.
- Add it to the list, click on “Apply”, and then on “Okay” to save the changes.
Try running the problematic program again to see if you still get the Access Violation at Address error.
Disable User Account Control
You are more likely to encounter the Access Violation at Address problem if you are trying to install or run a Java-based application. If this is the case, you can temporarily disable User Account Control to fix the problem.
- In your Windows search bar, enter “Control Panel” (without the quotes) and launch the app.
- Scroll down and click on “User Accounts.”
- Click on “User Accounts” again.
- In the right pane, click on “Change User Account Control settings.”
- Move the slider down to “Never Notify” and click “OK.”
Try running the affected program again to see if the problem has been resolved. After you run your program, remember to enable your user account settings.
Make Sure the Affected Software Isn’t Set as Read-only
You won’t be able to launch or run a program effectively if it’s in read-only mode. Here’s how to check and fix it:
- Locate the affected program’s shortcut on your desktop and right-click on the file.
- From the menu, select the “Properties” option.
- Go to the General tab, locate the “Attributes” section and make sure the read-only option is not checked.
- Click on “Apply”, then on “OK” to save changes.
Run the Problematic Program in Compatibility Mode
The reason you are receiving an Exception Access Violation error message on your PC could be due to compatibility issues. Some older programs that you are trying to run may not be compatible with newer operating systems like Windows 10.
Nevertheless, your operating system has a feature called Compatibility Mode that lets you run older applications. If you encounter this problem with an application, you can enable Compatibility mode.
- Locate the affected program’s shortcut on your desktop and right-click on the file.
- From the menu, select the “Properties” option.
- In the Properties menu, select the Compatibility tab.
- Select the “Run this program in compatibility mode” checkbox, then select an older Windows version from the drop-down menu.
- Click on “Apply” and “OK” to save changes.
Run the problematic program again to see if you still get the Access Violation at Address error.
Run the System File Checker and DISM Tools
Running the SFC and DISM tools can help fix system file corruption issues that might be causing the “Access Violation at Address” error. These tools can replace the corrupt or missing Windows system file that may be triggering other errors, such as BSODs.
To run the System File Checker (SFC) tool, follow the detailed steps below:
1. Open Command Prompt as an Administrator:
a. Right-click on the “Start” button or press the “Windows key + X.”
b. Select “Windows Terminal (Admin)” or “Command Prompt (Admin)” from the context menu.
c. If prompted by User Account Control, click “Yes” to grant the necessary permissions.
2. Run the SFC tool:
a. In the “Command Prompt” window, type “sfc /scannow” and press “Enter.”
b. The System File Checker will begin scanning your system for corrupted files. This process might take some time, so be patient.
c. If SFC finds any corrupted files, it will attempt to repair them automatically.
3. Restart your computer: Once the scan and repair process is complete, restart your computer to apply the changes.
In some cases, the SFC tool may not be able to fix the corrupted files. In such situations, you can use the Deployment Image Servicing and Management (DISM) tool to repair the Windows system image. Follow these steps to use the DISM tool:
4. Open Command Prompt as Administrator (follow the steps mentioned in the previous section).
5. Run the DISM tool:
a. In the Command Prompt window, type “DISM /Online /Cleanup-Image /RestoreHealth” and press Enter.
b. The DISM tool will connect to Windows Update to download and replace any damaged files in your system image. This process may take some time, so be patient.
c. Once the process is complete, you’ll see a message stating that the operation was completed successfully.
6. Run SFC tool again: After running the DISM tool, run the SFC tool again by typing “sfc /scannow” in the Command Prompt window and pressing Enter. This time, the SFC tool should be able to fix any remaining corrupted files.
7. Restart your computer: Once both tools have completed their tasks, restart your computer to apply the changes and resolve the issue.
Check Your RAM for Corruption
You may encounter this Access Violation at Address error if you previously had a malware infection that caused damage to parts of your RAM.
You can check your RAM for corruption using the following steps:
- Input “Windows memory diagnostic” (without the quotes) in your Windows Search bar and launch the program.
- Click on the “Restart now and check for problems” option.
- Just let the program run and wait for its results.
You should replace your RAM if it is corrupted.
Create an options.ini file
If Lord of The Rings: Battle for Middle Earth is the program giving the EXCEPTION_ACCESS_VIOLATION error, follow the steps below:
- Use the “Win + R” shortcut to launch the Run box.
- Input “%appdata%” (without the quotes) and click Enter.
- In the folder, create an options.ini file if it doesn’t exist there.
- Right-click on an empty space in the folder, and choose New > Text Document.
- Paste the following lines into the Text Document:
AudioLOD = Low
HasSeenLogoMovies = yes
IdealStaticGameLOD = VeryLow
Resolution = 800 600
StaticGameLOD = VeryLow
TimesInGame = 1
- Now, select File > Save as.
- Choose All Files and enter the options.ini in the File name section.
- Select the AppData > My Battle for Middle Earth Files folder as the saving location and click Save.
Troubleshoot Your Hardware
Many Windows users have had success in fixing the Access Violation at Address error by resolving their hardware issues. Simply follow the steps below:
- Use the “Win + I” shortcut to launch the Settings app.
- Click on “Update & Security.”
- In the left pane, click on “Troubleshoot.”
- Next, click on “Additional Troubleshooters.”
- Choose the piece of hardware you want to troubleshoot and follow the on-screen instructions to run the troubleshooter.
- Follow the on-screen instructions to run the troubleshooter.
Run the problematic program again to see if you still get the Access Violation at Address error.
Reinstall the Problematic Software
If you get the Access Violation at Address error when running a certain application, try reinstalling the affected program. There is a good chance that parts of the app you are trying to run have been damaged from crashes or improper saves. Perhaps, a buggy update has caused issues.
To remove the affected program, follow these steps:
- Use the “Win + I” shortcut to launch the Settings app.
- Click on “Apps.”
- Locate the problematic application from the list and click on “Uninstall.”
- Follow the usual procedure for installing the affected program.
If you’re running Windows 11, you can search for the app in the Start menu, right-click it, and select Uninstall.
Conclusion
There you have it—solutions to fix your “Access Violation at Address” problems on Windows 10. Feel free to use the comment box below to share which method helped you get rid of the error.
Follow this guide if you are having STATUS ACCESS VIOLATION error
by Afam Onyimadu
Afam is a geek and the go-to among his peers for computer solutions. He has a wealth of experience with Windows operating systems, dating back to his introduction… read more
Updated on
- Edge is built on the Chromium and will enjoy many of its benefits, but may be prone to any problems infecting its general source code.
- We explore the status_access_violation error in this guide and present the most potent ways to resolve it.
- If the problem is not resolved, you could use a Beta version of the browser, since not all errors on the standard versions occur on this test versions.
You deserve a better browser! Over 300 million people use Opera daily, a fully-fledged navigation experience coming with various built-in packages, enhanced resource consumption, and great design.Here’s what Opera can do:
- Easy migration: Use the Opera One assistant to transfer existing data, such as bookmarks, passwords, and more;
- Optimize resource usage: Opera One uses your Ram more efficiently than Edge;
- Enhanced privacy: Free and unlimited VPN integrated;
- No ads: Built-in Ad Blocker speeds up the loading of pages and protects against data-mining
- ⇒ Get Opera One
If you are having the error code: STATUS_ACCESS_VIOLATION on Microsoft Edge, go through this article to get all the helpful information and solutions.
The number of browsers that use the Chromium source code is steadily increasing. With Chromium, you have no concerns since you are enjoying all the Chrome pleasures without being limited to the resource-hugging Chrome browser.
However, there is the fear that if a significant flaw was introduced into this source code, it would cause all browsers to become infected at once. And it seems that this is the case with the STATUS ACCESS VIOLATION error on Edge.
When this error appears, you may get the following message:
This page is having a problem.
Error code: STATUS_ACCESS_VIOLATION
Don’t worry. This is not a very critical problem. You can easily get rid of it.
What is this error code Status_access_violation?
The STATUS_ACCESS_VIOLATION is a browser error that usually appears on Chromium-based web browsers like Google Chrome, Microsoft Edge, etc. It happens when your browser tries to access memory with an unspecified program code.
The whole thing can happen due to following reasons:
- Third-party extensions which are conflicting with some operations
- Incompatible or outdated browser
- Corrupted internal files
The good thing is you can easily solve this problem. In the next part of this article, you will find the steps to fix this problem.
Quick Tip:
Though this problem may not be unique to your Microsoft Edge, still, switching to another browser can be a good remedy. Opera One is known for using fewer additional extensions and avoiding incompatibilities.
Moreover, it brings some built-in features that are not found in many browsers, like an ad blocker and unlimited VPN for extra anonymity. Integrated apps like WhatsApp or sidebar access to Twitter and Instagram are a few other features that contribute to a refined experience.
Opera One
A Chromium-based browser with features that will deliver very smooth, errorless web browsing.
How do I fix the error code: Status_Access_Violation on Edge?
1. Rename the Edge executable file
- Launch your file explorer and navigate to the following location:
C:\Program Files (x86)\Microsoft\Edge\Application
- Right-click on msedge and select the Rename icon at the top of the context menu.
- Change the name to edge.exe and relaunch Edge.
2. Switch to the beta Edge edition
Microsoft also operates a Beta build in addition to the edition you may be using right now. BETA is mainly intended for testing experimental features; however, it may or may not be affected by problems that the stable release seems to have.
You should try this version before attempting other fixes. To get the beta version of this browser, visit the Microsoft Edge Insider website.
3. Update your browser
- Launch your Microsoft Edge browser.
- Go to the following location using the Edge address bar:
edge://settings/help
- Now, it will automatically check for the updates and install any available one.
When using Microsoft Edge, keep in mind that the browser scans for updates in the background at all times. Minor updates are loaded automatically and without prompting, but a significant upgrade, on the other hand, requires a browser restart.
4. Disable your Javascript extensions
- Launch your Edge browser.
- Click on the extensions icon and go to Manage extensions on Edge.
- If you have any extensions that work with Javascript, make sure to toggle them off, then restart the browser.
If removing the extension fixed the problem, you shouldn’t attempt using any of the disabled browser’s alternatives because the issue does not seem to be caused by a specific extension but rather by a JavaScript add-on.
5. Disable your Edge browser renderer code integrity
- On your desktop, right-click your Microsoft Edge icon, and from the context menu, select Properties.
- Click on the shortcut tab, and under the target field, paste: –disable-features=RendererCodeIntegrity
- Apply the changes you made and relaunch your browser from the desktop shortcut.
With that, we’ve come to the end of our guide on how to resolve the STATUS ACCESS VIOLATION error code in Microsoft Edge. We’ve presented five potential approaches that could work to your advantage.
- Edge is deprecating Web Select, but you might still use it
- What is the Briefcase Icon on the Edge Browser?
- Fix: RESULT_CODE_KILLED_BAD_MESSAGE Error Code on Microsoft Edge
- Project Corefield makes Edge a viable option for Gamers
- The customize sidebar option in Edge is getting a revamp
Can I uninstall Microsoft Edge and reinstall it?
In the normal way, you cannot uninstall Edge. However, there are very technical ways available to do it. Instead of that, we recommend you disable this browser. If you don’t like Edge, you can use other browsers like Opera One instead of fixing problems on it.
We have a dedicated article on it. Read: How to disable Edge on Windows
This article has featured the best methods to fix the error code: STATUS_ACCESS_VIOLATION on Microsoft Edge.
If none of these fixes work, you should consider using a different browser. The browser market is very saturated, and you will have many worthy alternatives to Microsoft Edge. Our guide on the best browsers should come in handy.
We love to read your comment and learn which of these solutions worked for you.