Попытка чтения или записи в защищенную память это часто свидетельствует о том что другая память
Ошибка происходит при попытке обновлятора подключиться к базе через COM. Полный текст ошибки такой:
Адресат вызова создал исключение. <= Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. в System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
22:13:58 в System.RuntimeType.InvokeMember
Помогает переустановка платформы 1с и/или переход на следующий релиз.
Внимание. Если у вас версия платформы 8.3.20.1549, то вам сюда.
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Ошибка: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Написан проект на c# и dll на c++, по отдельности компилируется без ошибок, но когда запускаешь проект, доходит до второй функции (написанной в dll) и выдает эту ошибку.
Это означает что вы пытаетесь писать или читать по адресу памяти, который не принадлежит вашей программе. Например, вы можете писать или читать память за пределами динамически выделенного массива, или обращаться к памяти по null-указателю.
System.AccessViolationException: «Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.»?
Написал пробную dll для создания процесса на с++. Вызываю её в консоли шарпа — вот такая ошибка. Вот коды:
- Вопрос задан более трёх лет назад
- 7466 просмотров
- Вконтакте
И нужно придумать как его
- Вконтакте
D0ct0r_Murder,
cb The size of the structure, in bytes.
D0ct0r_Murder, переносимость.
размер структуры на разных машинах будет разный.
из-за выравнивания в памяти.
1 — для проверки памяти используйте соответствующие тесты 1 и 2
2 — в общем случае, это говорит о том что у вас нарушения адресаций — какой то из подпроцессов залезает в память, которая ему не позволена
Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена
Я надеюсь, кто-то может просветить меня о том, что может вызвать эту ошибку:
Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена.
Я не могу опубликовать код, потому что эта ошибка, похоже, попадает в любую случайную область приложения. Приложение будет запускаться от 12 до 48 часов, прежде чем выбросить ошибку. Иногда он останавливается в кажущемся случайном месте и бросает вышеприведенную ошибку, иногда все приложение останавливается, и я получаю экран с ошибкой, которая говорит что-то вроде строки “Была фатальная ошибка в… Это может быть ошибка в CLR или…” что-то о PInvoke или другой не относящейся к делу информации. Когда это происходит, все потоки прекращаются и недоступна информация для отладки.
Вкратце это то, что делает приложение:
Это многопоточное серверное приложение, написанное полностью на С#. Клиенты подключаются к серверу через сокет. Сервер запускает виртуальную “среду” для клиентов, где они могут взаимодействовать друг с другом и с окружающей средой. Он потребляет довольно много памяти, но я не вижу его утечки. Обычно он потребляет около 1,5 ГБ. Я не думаю, что это утечка, потому что использование памяти остается относительно постоянным все время работы приложения. Его постоянно действующий код для поддержания среды, даже если клиенты ничего не делают. Он не использует стороннее программное обеспечение или другие API. Единственными внешними ресурсами, которые использует это приложение, являются соединения сокетов и соединения базы данных SQL. Он работает на 64-битном сервере. Я попытался отладить это в VS2008 и VS2010 с использованием .net 2.0, 3.5 и 4.0 и на нескольких серверах, и проблема все еще в конечном итоге возникает.
Я попытался отключить оптимизацию компилятора и несколько горячих исправлений для Microsoft. Ничто, похоже, не устраняет эту проблему. Было бы хорошо, если кто-нибудь знает какие-либо возможные причины или какой-то способ определить, что вызывает проблему.
Наконец, проследил это с помощью WinDBG и SOS. Нарушение прав доступа было вызвано неизвестной DLL. Оказывается, часть программного обеспечения под названием “Nvidia Network Manager” вызывает проблемы. Я читал бесчисленное количество раз, как эта проблема может быть вызвана брандмауэрами или антивирусом, ни один из которых я использую, поэтому я отклонил эту идею. Кроме того, я полагал, что это не экологичность, потому что это происходит на более чем одном сервере с использованием другого оборудования. Оказывается, все машины, на которых я тестировал это, запускали “NVidia Network Manager”. Я считаю, что он устанавливается вместе с остальными драйверами материнской платы.
Надеюсь, это поможет кому-то, поскольку эта проблема очень долгое время подвергалась моему заявлению.
Я столкнулся с этой проблемой в VS 2013.NET 4.5 с помощью MapInfo DLL. Оказывается, проблема в том, что я изменил платформу для сборки с x86 на любой CPU, и этого было достаточно, чтобы вызвать эту ошибку. Смена его обратно на x86 сделала трюк. Может помочь кому-то.
Я также столкнулся с этой проблемой в Visual Studio 2010. Более интересно, что у меня было несколько проектов в моем решении (консольное приложение, приложение WPF, приложение Windows Forms), но оно завершалось сбоем только тогда, когда я настраивал проект типа “Консольное приложение”. msgstr “как стартовый проект (даже для тех, у которых буквально не было кода или каких-либо дополнительных сборок, упомянутых отдельно от стандартных, которые поставляются с самим шаблоном проекта).
Следующее изменение наконец помогло мне решить проблему: перейдите к свойствам проекта консольного приложения → перейдите на вкладку ” Debug ” → перейдите к разделу ” Enable Debuggers ” на правой панели → установите Enable unmanaged code debugging ” Enable unmanaged code debugging как показано на снимке ниже. Коренная причина того, почему это произошло, до сих пор мне не известна. Единственное, что я заметил, было то, что было много обновлений Windows, которые были установлены на моем компьютере прошлой ночью, которые в основном состояли из офисных обновлений и обновлений ОС (более десятка статей по КБ).
Попробуйте выполнить эту команду
Проблема может быть связана с DLL смешанных сборных платформ в проекте. i.e Вы создаете свой проект на любом CPU, но имеете некоторые библиотеки DLL в проекте, уже созданном для платформы x86. Это приведет к случайным сбоям из-за различного отображения памяти 32-битной и 64-битной архитектуры. Если все библиотеки DLL построены для одной платформы, проблема может быть решена.
Эта ошибка не должна выполняться в управляемом коде. Это может решить проблему:
Перейдите в Visual Studio Debugger, чтобы обойти это исключение:
Надеюсь, это поможет.
У меня была эта проблема недавно, когда я изменил сервер разработки для проекта. Я получал эту ошибку в строке кода, где объявлял новую переменную OracleConnection.
После многих попыток, включая установку исправлений, я попытался изменить ссылки на Oracle.DataAccess и System.Data.OracleClient в проекте, и это сработало!
Когда проект перемещается на новый компьютер, я предлагаю вам обновить все ссылки, добавленные в этот проект.
Я столкнулся и нашел решение для этого исключения сегодня. Это происходило, когда я пытался отлаживать единичный тест (NUnit), который вызывал виртуальный метод в абстрактном классе.
Проблема связана с установкой.NET 4.5.1.
Я загрузил.NET 4.5.2 и установил (мои проекты все еще ссылаются на.NET 4.5.1), и проблема решена.
Вы пытались отключить DEP (Data Execution Prevention) для своего приложения?
Это может быть аппаратное обеспечение. Это может быть что-то сложное… но я хотел бы нанести удар, указав, что где-то ваш код потока не защищает какую-либо коллекцию (например, словарь) с соответствующей блокировкой.
Какие ОС и пакет обновления вы используете?
Подтверждаемый код не должен иметь возможности испортить память, поэтому там что-то небезопасное. Вы используете какой-либо небезопасный код в любом месте, например, в обработке буфера? Кроме того, материал о PInvoke может быть неактуальным, поскольку PInvoke включает в себя переход к неуправляемому коду и связанное с ним маршалинг.
Моя лучшая рекомендация – прикрепить к поврежденному экземпляру и использовать WinDBG и SOS, чтобы углубиться в то, что происходит во время сбоя. Это не для слабонервных, но на данном этапе вам может понадобиться выработать более мощные инструменты, чтобы определить, что именно происходит неправильно.
Я столкнулся с той же проблемой. Мой код был .NET dll (расширение AutoCAD), запущенным внутри AutoCAD 2012. Я также использую Oracle.DataAccess, и мой код бросает одно и то же исключение во время ExecuteNonQuery(). Я, к счастью, решил эту проблему, изменив версию .net ODP, которую я использовал (то есть 2.x of Oracle.DataAccess)
Хорошо, это может быть довольно бесполезно и просто анекдотично, но…
Это исключение было последовательно выбрано некоторыми библиотеками Twain32, которые мы использовали в моем проекте, но это произойдет только на моей машине.
Я попробовал множество предлагаемых решений по всему Интернету, но безрезультатно… Пока я не отключил свой мобильный телефон (он был подключен через USB).
И это сработало.
Оказывается, библиотеки Twain32 пытались перечислить мой телефон как совместимое с Twain устройство, и что-то, что оно делало в этом процессе, вызвало это исключение.
в моем случае файл был открыт и, следовательно, заблокирован.
Я получал его при попытке загрузить файл Excel с помощью LinqToExcel, который также был открыт в Excel.
это все, что я совершил
Эта проблема почти всегда простая. Код плохой. Это редко инструменты, как раз из статистического анализа. Невероятно, что миллионы людей используют Visual Studio каждый день, и, возможно, некоторые из них используют ваш код – какой бит кода получает лучшее тестирование? Я гарантирую, что если бы это была проблема с VS, мы бы, вероятно, уже ее нашли.
Что означает это утверждение, так это то, что при попытке получить доступ к памяти, которая не принадлежит вам, обычно это происходит потому, что вы делаете это с поврежденным указателем, который появился откуда-то еще. Вот почему он указывает указание.
При повреждении памяти ловушка ошибки редко находится рядом с основной причиной ошибки. И эффекты – это именно то, что вы описываете, кажущееся случайным. Вам просто нужно взглянуть на обычных преступников, например:
- неинициализированные указатели или другие значения.
- записывать больше в буфер, чем его размер.
- ресурсы, разделяемые потоками, которые не защищены мьютексами.
Работа назад от такой проблемы, чтобы найти первопричину, невероятно сложна, учитывая, что так много могло произойти между созданием проблемы и обнаружением проблемы.
Мне в основном легче смотреть на то, что коррумпировано (скажем, на определенный указатель), а затем выполнять ручной статический анализ кода, чтобы увидеть, что могло бы его испортить, проверяя обычных преступников, как показано выше. Однако даже это не будет ловить длинные цепочки проблем.
Я не знаю достаточно, чтобы узнать VS, но вы также можете изучить возможность использования инструмента отслеживания памяти (например, valgrind для Linux), чтобы узнать, могут ли он выявить любые очевидные проблемы.
У меня тоже была эта проблема.
В то же время я работал с различными решениями, используя визуальную студию, закрывая другие решения и запуская только целевое решение, и без этой ошибки работала нормально.
У меня такая же ошибка в проекте, с которым я работал в VB.NET. Проверка “Включить фреймворк приложения” на странице свойств решила его для меня.
Получается эта ошибка случайным образом в VS1017, когда вы пытаетесь построить проект, который был прекрасно построен днем ранее. Перезагрузка ПК исправила проблему (я также запустил следующую команду заранее, не уверен, что это необходимо: netsh winsock reset)
Я получил эту ошибку при использовании pinvoke для метода, который принимает ссылку на StringBuilder . Я использовал конструктор по умолчанию, который, по-видимому, выделяет только 16 байтов. Windows попыталась поместить в буфер более 16 байт и вызвала переполнение буфера.
Используйте большую емкость:
Мой ответ очень сильно зависит от вашего сценария, но у нас возникла проблема с попыткой обновить приложение .NET для клиента, которому было 10 лет, чтобы они могли работать в Windows 8.1. Ответ на @alhazen был для меня правильным. Приложение полагалось на стороннюю DLL, которую клиент не хотел платить за обновление (Pegasus/Accusoft ImagXpress). Мы перенаправили приложение на .NET 4.5, но каждый раз, когда выполнялась следующая строка, мы получили сообщение AccessViolationException was unhandled :
Чтобы исправить это, нам пришлось добавить в проект следующее событие post-build:
Это явно указывает исполняемый файл как несовместимый с Data Execution Prevention. Подробнее см. здесь.
Моя проблема была связана с тем, что некоторые библиотеки были скомпилированы с использованием.NET Framework 3.5, и мой проект ссылался на 4.6.1
Как только я изменил свою целевую структуру на 3.5 – тогда ошибки ушли.
В некоторых случаях это может произойти, когда:
В моем случае мне пришлось ссылаться на библиотеку C/C++, используя P/Invoke, но я должен был убедиться, что память была выделена для выходного массива, сначала используя fixed :