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

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

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

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

Вкратце это то, что делает приложение:

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

enter image description here

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

Ответ 8

Я столкнулся и нашел решение для этого исключения сегодня. Это происходило, когда я пытался отлаживать единичный тест (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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

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

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

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

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

Показать фигуру...

Ответ 14

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

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

Ответ 15

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

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

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

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

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

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

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

Ответ 19

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

Вместо

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

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

StringBuilder windowText = new StringBuilder(3000);

Ответ 20

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

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

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

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. Подробнее см. здесь.

Ответ 21

Моя проблема была связана с тем, что некоторые библиотеки были скомпилированы с использованием.NET Framework 3.5, и мой проект ссылался на 4.6.1

Как только я изменил свою целевую структуру на 3.5 - тогда ошибки ушли.

Ответ 22

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

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

Ответ 23

В моем случае мне пришлось ссылаться на библиотеку C/C++, используя P/Invoke, но я должен был убедиться, что память была выделена для выходного массива, сначала используя fixed:

[DllImport("my_c_func_lib.dll", CharSet = CharSet.Ansi)]
public static extern unsafe int my_c_func(double input1, double input2, double pinput3, double *outData);

    public unsafe double[] GetMyUnmanagedCodeValue(double input1, double input2, double input3)
    {
        double[] outData = new double[24];

        fixed (double* returnValue = outData)
        {
            my_c_func(input1, input2, pinput3, returnValue);
        }

        return outData;
    }

Для получения дополнительной информации, пожалуйста, смотрите: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/