Попытка чтения или записи в защищенную память - PullRequest
36 голосов
/ 27 февраля 2009

Я начал видеть исключение 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)

Ответы [ 13 ]

12 голосов
/ 09 июня 2010

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

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

11 голосов
/ 18 мая 2009

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

10 голосов
/ 10 декабря 2013

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

netsh winsock reset

3 голосов
/ 31 декабря 2014

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

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

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

1 голос
/ 22 февраля 2017

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

1 голос
/ 19 февраля 2014

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

1 голос
/ 08 августа 2013

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

1 голос
/ 04 декабря 2012

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

1 голос
/ 14 февраля 2012

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

0 голосов
/ 22 февраля 2018

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

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

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

...