Попытка чтения или записи защищенной памяти



Я начал видеть исключение 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 с пакетом обновления 1
Производственный сервер2: 2.0 sp2, 3.0 sp2, 3.5 с пакетом обновления 1



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



Вот несколько исключений и их трассировки стека:



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)
2068   13  

13 ответов:

У меня была та же проблема. 2.0 работал отлично. после установки до 3.5 с пакетом обновления 1, приложение получает нарушение прав доступа.

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

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

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

netsh winsock reset

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

Сообщено VS.NET AccessViolationException

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

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

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

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

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

В моем случае это было исправлено, когда я установил 'Enable 32 Bit applications' =True для пула приложений на сервере IIS.

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

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

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

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

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

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

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

    Cmd: netsh winsock reset

Откройте cmd.exe и выполните команду "netsh winsock reset catalog"

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

Comments

    Ничего не найдено.