Попытка чтения или записи в защищенную память

Я начал видеть исключение AccessViolationException в моем приложении в нескольких разных местах. Это никогда не происходило на моем компьютере для разработки, нашем тестовом сервере. Это также проявилось только на 1 из 2 наших производственных серверов. Поскольку это происходило только на одном из наших производственных серверов, я начал смотреть на установленные на серверах версии.net framework.


Я обнаружил, что (по какой-то странной причине) рабочий сервер, у которого были проблемы, имел 2.0 sp2, 3.0 sp2 и 3.5 sp1, в то время как другой рабочий сервер и тестовый сервер имели 2.0 sp1.


Мое приложение предназначено только для платформы 2.0, решило удалить все версии инфраструктуры с рабочего сервера и установить только 2.0 sp1. До сих пор я не смог воспроизвести проблему. Очень интересно.

ПК разработчика: компактный 2.0 sp2, компактный 3.5, 2.0 sp2, 3.0 sp2, 3.5 sp1 Тестовый сервер: 2.0 sp1 Рабочий сервер1: 2.0 sp1 Рабочий сервер2: 2.0 sp2, 3.0 sp2, 3.5 sp1

Теперь, почему я не могу воспроизвести проблему на моем компьютере разработчика, на котором есть 2.0 sp2, я не могу понять. Я слышал слухи о том, что это нарушение доступа может происходить на некоторых программах, использующих удаленное взаимодействие, что и у меня, но нарушение доступа никогда не происходит, когда удаленное взаимодействие действительно происходит. Я в порядке с использованием только 2.0 sp1 на данный момент, но мне действительно интересно знать, если у кого-то была эта проблема, и если они нашли обходной путь для более новых версий frameowork.

Вот пара исключений и их следы стека:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at ICSharpCode.TextEditor.TextArea.HandleKeyPress(Char ch)
   at ICSharpCode.TextEditor.TextArea.SimulateKeyPress(Char ch)
   at ICSharpCode.TextEditor.TextArea.OnKeyPress(KeyPressEventArgs e)
   at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
   at System.Windows.Forms.Control.WmKeyChar(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
   at System.Windows.Forms.Control.DefWndProc(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
   at System.Windows.Forms.RichTextBox.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

14 ответов

Решение

У меня такая же проблема. 2.0 работал нормально. после установки до 3.5 sp1 приложение получает Access Violation.

Установил http://support.microsoft.com/kb/971030 и моя проблема решена, хотя я не использую LCG.

У меня была такая же проблема после обновления.NET 4.5 до.NET 4.5.1. Что исправило это для меня было выполнение этой команды:

netsh winsock reset

Microsoft также выпустила исправление (2 июля 2007 г.), чтобы предотвратить ошибку "Попытка чтения или записи защищенной памяти", которая уже давно страдает от платформы.NET 2.0. Посмотрите на http://support.microsoft.com/kb/923028 - не уверен, относится ли он к вам, но подумал, что вы могли бы проверить это.

Для VS 2013, .NET Framework 4.5.1 также имеет AccessViolationException ошибка (KB2915689) при работе с сокетами SQL Server / TCP. Обновление до .NET Framework 4.5.2 исправляет эту проблему.

Отмечено исключение VS.NET AccessViolationException

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

В некоторых случаях добавление "Option Strict On" в VB.NET и решение всех проблем, которые он находит путем правильного приведения, решило эту проблему для меня.

Я использовал OLEDB и переключился на SQL Client, и это решило мою проблему с этой ошибкой.

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

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

Привет Есть две возможные причины.

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

    cmd: netsh winsock reset

открыть cmd.exe и запустить команду "netsh winsock reset catalog"

  1. Антивирус считает неуправляемый код вредным и ограничивает запуск этого кода,отключает антивирус и затем проверяет

В моем случае это было исправлено, когда я установил "Включить 32-битные приложения" =True для пула приложений на сервере IIS.

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

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

Я забыл добавить EntityFramework при создании нового проекта, который вызвал эту проблему.

В моем случае у меня были проблемы с "переменными среды" при добавлении ссылки на мою COM DLL.

Когда я добавил ссылку на свой проект, я искал путь P:\Core, тогда как в прошлом я добавил путь c:\core в среду path.

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

Другие вопросы по тегам