随机错误:尝试读取或写入受保护的内存

fra*_*ins 11 c# memory-leaks shapefile geoapi sharpmap

我们有一个使用WCF服务的C#.Net应用程序.该应用程序部署在Windows服务应用程序下的生产服务器中.该模块的一部分负责创建形状文件((*.shp,*.dbf),用于工作人员今天工作的较小区域,并将其发送到PDA.

要编写形状文件,我们使用第三方DLL NetTopologySuite

GisSharpBlog.NetTopologySuite.IO.ShapefileWriter
Run Code Online (Sandbox Code Playgroud)

这也是在C#中.(我不确定它引用的任何dll是否使用非托管代码.) 系统可能会工作一段时间再说一个星期.突然间我们得到一个例外说法

Attempted to read or write protected memory. 
This is often an indication that other memory is corrupt.
Run Code Online (Sandbox Code Playgroud)

从Write方法,我们将几何集合写入形状文件.

sfw.Write(FileName, new GeometryCollection(gc.ToArray()));
Run Code Online (Sandbox Code Playgroud)

(GeometryCollection也来自第三方dll,GeoAPI.dll)

此错误会导致整个服务失效并使其无法正常运行.然后我们只是重新启动服务并尝试再次运行相同的数据,它将再工作一周,直到它再次崩溃.它只发生在生产中和随机时间.我们无法找到问题的原因.

许多论坛都认为这可能是因为某些非托管代码中的内存泄漏.但我们找不到哪一个.

我们也准备重写创建新形状文件的部分.请帮我解决这个问题.如果需要更多详细信息,请与我们联系.提前致谢.

小智 8

根据我的经验,该消息是内存泄漏的结果.如果我处于你的情况,特别是因为你正在处理第三方DLL,这就是我要做的.

1)监视您的WCF服务器,看看DLLHost.exe和任务管理器中的aspnet服务发生了什么.我有一种感觉,你的第三方DLL有一个内存泄漏导致这两个服务膨胀并达到服务器内存的限制.这就是它工作一段时间然后突然停止工作的原因.

2)确定何时可以回收服务器内存和应用程序池的良好计划.由于问题猖獗,您可能希望每隔午夜或没有人积极使用它时这样做.

3)编写一个好的错误记录代码,以确切地知道在它陷入困境期间发生了什么.我会在错误日志中提供以下信息:您传递的参数,遇到该问题的用户等等.这样您就可以准确地知道发生了什么.

4)检查事件查看器,因为可能存在一些可以查明问题的信息.

4)完成1,2和3后,我将调用您的第三方DLL供应商,看看他们可以做些什么来帮助您.您可能需要提供从上面的1,2,3和4项中收集的信息.

祝你好运,我希望这会有所帮助.