Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена - PullRequest
121 голосов
/ 02 ноября 2010

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

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

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

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

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

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

Ответы [ 22 ]

3 голосов
/ 01 мая 2012

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

3 голосов
/ 02 ноября 2010

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

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

3 голосов
/ 02 ноября 2010

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

Что такое ОС и пакет обновленияты бежишь?

2 голосов
/ 13 октября 2015

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

Я получал его при попытке загрузить файл 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);
    }
1 голос
/ 06 июля 2016

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

1 голос
/ 11 октября 2016

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

1 голос
/ 21 января 2019

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

Вместо

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

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

StringBuilder windowText = new StringBuilder(3000);
1 голос
/ 06 ноября 2018

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

1 голос
/ 02 ноября 2010

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

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

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

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

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

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

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

0 голосов
/ 24 февраля 2019

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

obj = new obj();
...
obj.Dispose();  // <-----------------    Incorrect disposal causes it
obj.abc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...