it-roy-ru.com

Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена

Я надеюсь, что кто-то может объяснить мне, что может быть причиной этой ошибки:

Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Я действительно не могу опубликовать код, потому что эта ошибка, кажется, появляется в любой случайной области приложения. Приложение будет работать где-то за 12-48 часов до появления ошибки. Иногда он останавливается в кажущемся случайном месте и выдает вышеуказанную ошибку, в других случаях все приложение останавливается, и я получаю экран с ошибкой, которая говорит что-то вроде: «Произошла фатальная ошибка в ... Это может быть ошибка в CLR или ... "что-то о PInvoke или другой не относящейся к делу информации. Когда это происходит, все потоки показываются прерванными, и отладочной информации нет. 

В двух словах, это то, что делает приложение:

Это многопоточное серверное приложение, полностью написанное на C #. Клиенты подключаются к серверу через сокет. Сервер запускает виртуальную «среду» для клиентов, где они могут взаимодействовать друг с другом и средой. Он потребляет совсем немного памяти, но я не вижу его утечки. Обычно он занимает около 1,5 ГБ. Я не думаю, что это утечка, потому что использование памяти остается относительно постоянным в течение всего времени работы приложения. Это постоянно работающий код для поддержки среды, даже если клиенты ничего не делают. Он не использует стороннее программное обеспечение или другие API. Единственные внешние ресурсы, которые использует это приложение - это сокетные соединения и соединения с базой данных SQL. Он работает на 64-битном сервере. Я попытался отладить это в VS2008 и VS2010, используя .net 2.0, 3.5 и 4.0 и на нескольких серверах, и проблема все еще в конечном итоге возникает. 

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

111
Someone Else

Наконец выследили это с помощью WinDBG и SOS. Нарушение прав доступа было вызвано неизвестной DLL. Оказывается, часть программного обеспечения под названием «Nvidia Network Manager» вызывала проблемы. Я читал бесчисленное количество раз, как эта проблема может быть вызвана брандмауэрами или антивирусами, ни один из которых я не использую, поэтому я отклонил эту идею. Кроме того, я исходил из того, что он не был экологическим, потому что это происходит на более чем 1 сервере, использующем другое оборудование. Оказывается, все машины, на которых я тестировал, работали под управлением «NVidia Network Manager». Я считаю, что он устанавливается вместе с остальными драйверами материнской платы. 

Надеюсь, это кому-нибудь поможет, так как эта проблема мучила мое приложение очень долгое время. 

17
Someone Else

Я только что столкнулся с этой проблемой в VS 2013.NET 4.5 с DLL MapInfo. Оказывается, проблема была в том, что я изменил Platform for Build с x86 на Any CPU, и этого было достаточно, чтобы вызвать эту ошибку. Смена его обратно на x86 добилась цели. Может помочь кому-нибудь.

39
Sergey

Попробуйте запустить эту команду

netsh winsock reset

Источник: https://stackoverflow.com/a/20492181/1057791

11
BornToCode

Я также столкнулся с этой проблемой в Visual Studio 2010. Более интересно, у меня было несколько проектов в моем решении (консольное приложение, приложение WPF, приложение Windows Forms), но оно завершалось сбоем только тогда, когда я настраивал проект типа «Консольное приложение». msgstr "как стартовый проект (даже для тех, у которых буквально не было кода или каких-либо дополнительных сборок, упомянутых отдельно от стандартных, которые поставляются с самим шаблоном проекта). 

Следующее изменение наконец помогло мне решить проблему: перейдите в свойства проекта консольного приложения -> перейдите на вкладку Debug -> перейдите в раздел Enable Debuggers на правой панели -> установите флажок Enable unmanaged code debugging, как показано на снимке ниже. Коренная причина того, почему это произошло, до сих пор мне не известна. Единственное, что я заметил, было то, что было много обновлений Windows, которые были установлены на моем компьютере прошлой ночью, которые в основном состояли из офисных обновлений и обновлений ОС (более десятка статей КБ).

 enter image description here

11
RBT

Проблема может быть связана со смешанными библиотеками платформ сборки в проекте. Т.е. вы строите свой проект на любом процессоре, но в проекте уже есть некоторые библиотеки DLL для платформы x86. Это приведет к случайным сбоям из-за различий в отображении памяти 32-битной и 64-битной архитектуры. Если все библиотеки DLL созданы для одной платформы, проблема может быть решена.

8
Muhammad Yousaf Sulahria

Эта ошибка не должна возникать в управляемом коде. Это может решить проблему:

Перейдите в Visual Studio Debugger, чтобы обойти это исключение:

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

Надеюсь, это поможет.

7
curiousBoy

Я столкнулся и нашел решение этого исключения сегодня. Это происходило, когда я пытался отладить модульный тест (NUnit), который вызывал виртуальный метод в абстрактном классе.

Кажется, проблема связана с установкой .NET 4.5.1.

Я скачал .NET 4.5.2 и установил (мои проекты все еще ссылаются на .NET 4.5.1), и проблема решена.

Источник решения: 

https://connect.Microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception

5
gb2d

У меня была эта проблема недавно, когда я изменил сервер разработки для проекта. Я получил эту ошибку в строке кода, где я объявил новую переменную OracleConnection.

Попробовав многие вещи, включая установку исправлений, я попытался изменить ссылки Oracle.DataAccess и System.Data.OracleClient в проекте, и это сработало!

Когда проект переносится на новый компьютер, я предлагаю вам обновить все ссылки, добавленные в этот проект.

5
deepakg_rao

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

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

3
Dan Bryant

Вы пытались отключить DEP (Предотвращение выполнения данных) для своего приложения?

3
alhazen

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

Какую ОС и пакет обновлений вы используете?

3
Mitch Wheat

Хорошо, это может быть довольно бесполезно и просто анекдотично, но ...

Это исключение постоянно генерировалось некоторыми библиотеками Twain32, которые мы использовали в моем проекте, но происходило только на моей машине.

Я перепробовал множество предлагаемых решений по всему интернету, но безрезультатно ... Пока я не отключил свой мобильный телефон (он был подключен через USB).

И это сработало.

Оказывается, библиотеки Twain32 пытались указать мой телефон как совместимое с Twain устройство, и что-то, что он сделал в этом процессе, вызвало это исключение.

Пойди разберись ...

3
almulo

Я столкнулся с той же проблемой. Мой код был .NET dll (расширение AutoCAD), работающий внутри AutoCAD 2012. Я также использую Oracle.DataAccess, и мой код выдавал то же исключение во время ExecuteNonQuery (). Я, к счастью, решил эту проблему, изменив используемую мной версию .net ODP (то есть 2.x Oracle.DataAccess).

3
kmxr

Этот вопрос почти всегда является простым. Код плохой. Это редко инструменты, только из статистического анализа. Неисчислимые миллионы людей используют Visual Studio каждый день, и, возможно, некоторые используют ваш код - какой фрагмент кода проходит лучшее тестирование? Я гарантирую, что если бы это было проблемой с VS, мы, вероятно, уже нашли бы это.

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

С повреждением памяти, перехват ошибки редко находится рядом с основной причиной ошибки. И эффекты именно то, что вы описываете, на первый взгляд случайные. Вам просто нужно посмотреть на обычных преступников, такие вещи, как:

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

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

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

Я не достаточно знаком с VS, чтобы знать, но вы можете также рассмотреть возможность использования инструмента отслеживания памяти (такого как valgrind для Linux), чтобы увидеть, может ли он обнаружить какие-либо очевидные проблемы.

2
paxdiablo

в моем случае файл был открыт и поэтому заблокирован. 

Я получал его при попытке загрузить файл Excel с помощью LinqToExcel, который также был открыт в Excel. 

это все, что я сделал

    var maps = from f in book.Worksheet<NavMapping>()
                select f;
    try {
        foreach (var m in maps)
            if (!string.IsNullOrEmpty(m.SSS_ID) && _mappings.ContainsKey(m.SSS_ID))
                _mappings.Add(m.SSS_ID, m.CDS_ID);
    } catch (AccessViolationException ex) {
        _logger.Error("mapping file error. most likely this file is locked or open. " + ex);
    }
2
Sonic Soul

у меня тоже была эта проблема ... Я одновременно запускал разные решения, используя Visual Studio, при закрытии других решений и запуске только целевого решения он работал без этой ошибки.

1
ako

Я получил ту же ошибку в проекте, с которым работал в VB.NET. Проверка «Включить каркас приложения» на странице свойств решила это для меня.

1
Tony Raymond

Я получил эту ошибку при использовании pinvoke для метода, который принимает ссылку на StringBuilder. Я использовал конструктор по умолчанию, который, по-видимому, выделяет только 16 байтов. Windows попыталась поместить в буфер более 16 байт и вызвала переполнение буфера.

Вместо

StringBuilder windowText = new StringBuilder(); // Likely overflow of default capacity of 16

Используйте большую емкость:

StringBuilder windowText = new StringBuilder(3000);
1
Charlie

В некоторых случаях это может произойти, когда:

obj = new obj();
...
obj.Dispose();  // <-----------------    Incorrect disposal causes it
obj.abc...
0
T.Todua

Мой ответ во многом зависит от вашего сценария, но у нас возникла проблема при попытке обновить приложение .NET для клиента, которому> 10 лет, чтобы они могли заставить его работать в Windows 8.1. Ответ @ alhazen был для меня подходящим. Приложение полагалось на стороннюю DLL, которую клиент не хотел платить за обновление (Pegasus/Accusoft ImagXpress). Мы перенаправили приложение на .NET 4.5, но каждый раз, когда выполнялась следующая строка, мы получали сообщение AccessViolationException was unhandled:

UnlockPICImagXpress.PS_Unlock (1908228217,373714400,1341834561,28447);

Чтобы это исправить, нам нужно было добавить следующее событие после сборки в проект:

call "$(DevEnvDir)..\tools\vsvars32.bat"
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\AMD64\editbin.exe" /NXCOMPAT:NO "$(TargetPath)"

Это явно определяет исполняемый файл как несовместимый с Data Execution Prevention. Для более подробной информации смотрите здесь .

0
Barrie

Получил эту ошибку случайно в VS1017, когда пытался построить проект, который строился совершенно нормально днем ​​ранее. Перезагрузка ПК исправила проблему (я также заранее запустил следующую команду, не уверен, требуется ли она: netsh winsock reset)

0
Eternal21