我们有一个使用WCF服务的C#.Net应用程序。该应用程序部署在Windows服务应用程序下的生产服务器中。该模块的一部分负责创建形状文件((* .shp,* .dbf),用于工作人员今天工作的较小区域,并将其发送到PDA。
要编写形状文件,我们使用第三方dll,NetTopologySuite
GisSharpBlog.NetTopologySuite.IO.ShapefileWriter
也在C#中。 (我不确定它引用的任何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)
此错误会导致整个服务失效并使其无法正常运行。然后我们只是重新启动服务并尝试再次运行相同的数据,它将再工作一周,直到它再次崩溃。它只发生在生产中和随机时间。我们无法找到问题的原因。
许多论坛都认为这可能是因为某些非托管代码中的内存泄漏。但我们找不到哪一个。
我们也准备重写创建新形状文件的部分。 请帮我解决这个问题。 如果需要更多详细信息,请与我们联系。提前谢谢。
答案 0 :(得分:8)
根据我的经验,该消息是内存泄漏的结果。如果我遇到你的情况,这就是我要做的事情,特别是因为你正在处理第三方DLL。
1)监视您的WCF服务器,看看DLLHost.exe和任务管理器中的aspnet服务发生了什么。我有一种感觉,你的第三方DLL有内存泄漏导致这两个服务膨胀并达到服务器内存的限制。这就是它工作一段时间然后突然停止工作的原因。
2)确定何时可以回收服务器内存和应用程序池的良好计划。由于问题猖獗,您可能希望每隔午夜或没有人积极使用它时这样做。
3)编写一个好的错误记录代码,以确切地知道在它陷入困境期间发生了什么。我会在错误日志中提供以下信息:您传递的参数,遇到该问题的用户等等。这样您就可以确切地知道发生了什么。
4)检查事件查看器,因为可能存在一些可以查明问题的信息。
4)完成1,2和3后,我将致电您的第三方DLL供应商,看看他们可以做些什么来帮助您。您可能需要提供从上面的1,2,3和4项中收集的信息。
祝你好运,我希望这会有所帮助。答案 1 :(得分:1)
我认为你在第三个库中有一些非托管代码,它们获得了受系统保护或其他应用程序使用的地址。
答案 2 :(得分:0)
您的某个第三方DLL中有一个Access Violation
(指向不属于您的应用程序空间的内存的指针,包括null
/ mass - 0x0
- 地址)。
否则,可能是您正在使用的某些非托管COMObject
会导致此错误。
答案 3 :(得分:-1)
这个错误的随机性质,对我来说可能是线程问题。具体来说,可能已调用Write
ShapefileWriter
方法,在线程中延迟,然后调用Close
。然后,延迟Write
方法尝试写入已关闭(并受保护)的文件,这可能会导致您看到的错误。
这纯粹是猜测,因为没有太多的代码可以做出更好的猜测,但我使用视频编写库遇到过这个问题,所以在你的情况下它可能是相同的。
答案 4 :(得分:-1)
检查以确保线程中没有线程。这就是我遇到这个错误时发生的事情。有关详细信息,请参阅此链接:Attempted to read or write protected memory. This is often an indication that other memory is corrupt