11

我们有一个使用 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)

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

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

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

4

5 回答 5

8

根据我的经验,该消息是内存泄漏的结果。如果我遇到您的情况,尤其是您正在使用第三方 DLL,这就是我会做的事情。

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

2) 确定何时可以回收服务器内存和应用程序池的良好时间表。由于这个问题很猖獗,您可能希望在每个午夜或没有人积极使用它时执行此操作。

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

4) 检查事件查看器,因为其中可能有一些可以查明问题的信息。

4) 做完 1、2、3 之后,我会打电话给你的第三方 DLL 供应商,看看他们能做些什么来帮助你。您可能需要提供从上述 1、2、3 和 4 项中收集的信息。

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

于 2013-03-12T16:33:24.010 回答
1

我认为您在第三个库中有一些非托管代码正在获取受系统保护或由其他应用程序使用的地址。

于 2013-03-26T20:12:45.667 回答
0

您的第三方 DLL 中有一个Access Violation(指向不属于您的应用程序空间的内存的指针,包括null/mass - - 地址)。0x0

否则,可能COMObject是您正在使用的一些非托管导致此错误。

于 2013-03-28T10:29:59.557 回答
-1

这个错误的随机性向我暗示这可能是线程问题。具体来说,Write方法ShapefileWriter可能已经被调用,在线程中被延迟然后你调用Close. 然后,延迟Write方法会尝试覆盖已关闭(且受保护)的文件,这可能会导致您看到的错误。

这纯粹是猜测,因为没有太多代码可以做出更好的猜测,但是我使用视频编写库遇到过这个问题,所以在你的情况下可能是一样的。

于 2013-03-27T12:47:30.290 回答
-1

检查以确保线程中没有线程。这就是我遇到此错误时发生的情况。有关详细信息,请参阅此链接:尝试读取或写入受保护的内存。这通常表明其他内存已损坏

于 2013-08-08T17:32:02.410 回答