Случайная ошибка: Попытка чтения или записи защищенной памяти

У нас есть приложение С# .Net, использующее службы WCF. И приложение развернуто на нашем производственном сервере под приложением службы Windows. Одна часть модуля отвечает за создание шейп-файлов ((*.shp, *.dbf) для меньшей области, над которой сегодня будут работать рабочие, и отправки их на КПК.

Для записи шейп-файлов мы используем стороннюю dll, NetTopologySuite.

GisSharpBlog.NetTopologySuite.IO.ShapefileWriter

который также находится в С#. (Я не уверен, что какой-либо dll, на который он ссылается, использует неуправляемый код.) Система может работать нормально какое-то время, скажем, неделю. Затем внезапно мы получаем исключение, говорящее

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)

Эта ошибка останавливает весь сервис и делает его неработоспособным. Затем мы просто перезапустим службу и попытаемся снова запустить те же данные, она будет работать нормально еще неделю, пока снова не выйдет из строя. Это происходит только в производстве и в случайное время. Нам не удалось найти причину проблемы.

Многие форумы предполагают, что это может быть из-за утечек памяти в каком-то неуправляемом коде. Но мы не смогли найти какой.

Мы также готовы переписать часть, создающую новые шейп-файлы. Пожалуйста, помогите мне решить эту проблему. Дайте мне знать, если потребуется дополнительная информация. Заранее спасибо.


person franklins    schedule 12.03.2013    source источник
comment
А ваш вопрос?   -  person Jim Mischel    schedule 12.03.2013
comment
Можете ли вы прикрепить отладчик и посмотреть на стек вызовов?   -  person NtscCobalt    schedule 12.03.2013
comment
Это не утечка памяти, это GPF en.wikipedia.org/wiki/General_protection_fault или другими словами, ошибка в родном мире (например, эквивалент NullReferenceException в .NET). Проверьте все собственные библиотеки DLL сторонних производителей, которые вы используете. В одном из них есть ошибка, или вы не используете его так, как он ожидает, и он не говорит вам об этом.   -  person Simon Mourier    schedule 22.03.2013


Ответы (5)


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

1) Следите за своим сервером WCF и смотрите, что происходит с DLLHost.exe и службами aspnet в диспетчере задач. У меня такое ощущение, что в вашей сторонней DLL есть утечка памяти, из-за которой эти 2 службы раздуваются и достигают предела памяти ваших серверов. Это причина, почему он работает некоторое время, а затем внезапно просто перестал работать.

2) Определите хороший график, когда вы можете перезапустить память вашего сервера и пул приложений. Поскольку проблема широко распространена, вы можете делать это каждую полночь или когда никто активно ее не использует.

3) Напишите хороший код регистрации ошибок, чтобы точно знать, что происходит во время зависания. Я бы поместил в журналы ошибок следующую информацию: параметры, которые вы передаете, пользователь, который столкнулся с этой проблемой и т. д. Это необходимо для того, чтобы вы точно знали, что происходит.

4) Проверьте средство просмотра событий, возможно, там есть какая-то информация, которая может указать на проблему.

4) Выполнив шаги 1, 2 и 3, я позвоню вашему стороннему поставщику DLL и узнаю, чем они могут вам помочь. Возможно, вам потребуется предоставить информацию, которую вы собрали из пунктов 1, 2, 3 и 4 выше.

Удачи, и я надеюсь, что это поможет.

person PM_ME_YOUR_CODE    schedule 12.03.2013

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

person Hussein Zawawi    schedule 26.03.2013

У вас есть Access Violation (указатель на память, не принадлежащую вашему пространству приложения, включая null/mass - 0x0 - адрес) в одной из ваших сторонних библиотек DLL.

Или, может быть, вы используете какой-то неуправляемый COMObject, который вызывает эту ошибку.

person Mathieu Amiot    schedule 28.03.2013
comment
Всем, кто проголосовал за это, почему? Мой ответ абсолютно правильный, так как я не вижу всю кодовую базу должным образом, я не могу сказать больше об этом случае. Таким образом, давая необходимые ведет о том, как решить эту проблему. - person Mathieu Amiot; 19.01.2015

Случайный характер этой ошибки подсказывает мне, что это может быть вопрос потоков. В частности, мог быть вызван метод Write для ShapefileWriter, он был задержан в потоке, после чего вы вызываете Close. Затем отложенный метод Write пытается перезаписать закрытый (и защищенный) файл, что может привести к ошибке, которую вы видите.

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

person Steven Mills    schedule 27.03.2013

Убедитесь, что у вас нет потоков внутри потоков. Вот что произошло, когда я столкнулся с этой ошибкой. См. эту ссылку для получения дополнительной информации: ot/">Попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена

person Joe Brunscheon    schedule 08.08.2013
comment
Было ли это постоянным или происходило в случайное время, скажем, через 2 или 3 недели, как в моем случае? - person franklins; 09.08.2013
comment
Наш был довольно последовательным. Как только мы узнали, что это было, мы могли заставить это исключение произойти в течение нескольких минут после запуска приложения. - person Joe Brunscheon; 09.08.2013