Случайная ошибка: попытка чтения или записи в защищенную память
У нас есть приложение на C# .Net, использующее сервисы WCF. И приложение развертывается на нашем производственном сервере под приложением-службой Windows. Одна часть модуля отвечает за создание файлов форм ((*.shp, *.dbf) для небольшой области, на которой сегодня будут работать рабочие, и отправки их на КПК.
Для записи файлов формы мы используем стороннюю dll, NetTopologySuite
GisSharpBlog.NetTopologySuite.IO.ShapefileWriter
который также находится в C#. (Я не уверен, что какая-либо dll it-ссылка использует неуправляемый код.) Система может работать некоторое время, скажем, неделю. Тогда вдруг мы получаем исключение, говорящее
Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
из метода Write, где мы записываем коллекцию геометрии для формирования файлов.
sfw.Write(FileName, new GeometryCollection(gc.ToArray()));
(GeometryCollection также принадлежит сторонним dll, GeoAPI.dll)
Эта ошибка сбивает весь сервис и делает его неработоспособным. Затем мы просто перезапустим службу и попробуем снова запустить те же данные, они будут нормально работать еще неделю, пока снова не произойдет сбой. Это происходит только в производстве и в случайное время. Мы не смогли найти причину проблемы.
Многие форумы предполагают, что это может быть из-за утечек памяти в неуправляемом коде. Но мы не могли найти какой.
Мы также готовы переписать часть, которая создает новые файлы формы. Пожалуйста, помогите мне решить эту проблему. Дайте мне знать, если потребуется более подробная информация. Заранее спасибо.
5 ответов
По моему опыту, это сообщение было результатом утечки памяти. Это то, что я буду делать, если я нахожусь в вашей ситуации, особенно если вы работаете над сторонней DLL.
1) Контролируйте свой WCF-сервер и посмотрите, что происходит с DLLHost.exe и службами aspnet в диспетчере задач. У меня такое ощущение, что у вашей сторонней DLL есть утечка памяти, которая приводит к тому, что эти 2 службы раздуваются и достигают предела памяти вашего сервера. Это причина, почему это работает некоторое время, а затем вдруг просто перестал работать.
2) Определите хороший график, когда вы сможете перерабатывать память серверов и пул приложений. Поскольку проблема широко распространена, вы можете захотеть делать это каждую полночь или когда никто не использует ее активно.
3) Напишите хороший код регистрации ошибок, чтобы точно знать, что происходит в течение времени, когда он застрял. Я бы поместил следующую информацию в журналы ошибок: параметры, которые вы передаете, пользователь, который столкнулся с этой проблемой и т. Д. Это так, чтобы вы точно знали, что происходит.
4) Проверьте Event Viewer, так как, возможно, там есть некоторая информация, которая может точно определить проблему.
4) После выполнения 1, 2 и 3 я позвоню вашему стороннему поставщику DLL и выясню, что они могут сделать, чтобы помочь вам. Возможно, вам придется предоставить информацию, которую вы собрали из 1, 2, 3 и 4 пунктов сверху.
Удачи, и я надеюсь, что это поможет.
Я думаю, что у вас есть неуправляемый код в третьих библиотеках, который получает адрес, защищенный системой или используемый другими приложениями.
У вас есть Access Violation
(указатель на память, не принадлежащую вашему приложению, включая null
/ масса - 0x0
- адрес) в одной из ваших сторонних DLL.
Или, может быть, это какой-то неуправляемый COMObject
вы используете это вызывает эту ошибку.
Случайный характер этой ошибки подсказывает мне, что это может быть вопросом потоков. В частности, Write
метод ShapefileWriter
мог быть вызван, задержался в потоке, то вы звоните Close
, Отсроченный Write
Затем метод пытается перезаписать закрытый (и защищенный) файл, что может привести к появившейся ошибке.
Это чисто предположение, так как не так много кода, чтобы сделать правильное предположение, но я столкнулся с этой проблемой при использовании библиотек видео записи, поэтому в вашем случае это может быть так же.
Убедитесь, что у вас нет потоков внутри потоков. Вот что случилось, когда я столкнулся с этой ошибкой. См. Эту ссылку для получения дополнительной информации: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена