C# .Net Compact Framework控制台应用程序-由于OutOfMemory而静默终止

C# .Net Compact Framework控制台应用程序-由于OutOfMemory而静默终止,c#,garbage-collection,compact-framework,windows-ce,C#,Garbage Collection,Compact Framework,Windows Ce,在无头WindowsCE6.0R3设备上,我正在运行基于.NETCF3.5的控制台应用程序。这个控制台应用程序由许多DLL组成,都是托管代码。此外,它并没有任何数据库功能,当然也并没有Windows窗体控件。 经过大约12小时到48小时的随机持续时间后,此应用程序停止运行,看起来好像被CF运行时悄悄终止了。调查结果如下: 通过VS2008进行的远程调试不会显示任何运行时异常。即使在“调试->异常”菜单中,“公共语言运行时异常”->“系统”已启用“抛出” 应用程序终止后,.Net CF远程性能监视

在无头WindowsCE6.0R3设备上,我正在运行基于.NETCF3.5的控制台应用程序。这个控制台应用程序由许多DLL组成,都是托管代码。此外,它并没有任何数据库功能,当然也并没有Windows窗体控件。 经过大约12小时到48小时的随机持续时间后,此应用程序停止运行,看起来好像被CF运行时悄悄终止了。调查结果如下:

  • 通过VS2008进行的远程调试不会显示任何运行时异常。即使在“调试->异常”菜单中,“公共语言运行时异常”->“系统”已启用“抛出”

  • 应用程序终止后,.Net CF远程性能监视器显示以下内容: A.GC值之后使用的托管字节不会急剧上升和下降。 B.GC显示奇怪值后使用的总字节数

  • 启用Windows CE错误报告没有帮助,因为不会生成转储文件

  • 唯一可以得到的提示是启用.Net CF错误日志记录时。静默应用程序终止后,将创建一个文件“netcf_Error.log”,该文件通常包含一个单词“OutOfMemory”。这个词有时只出现一次或重复几次

  • 我猜问题可能与堆碎片有关,而不是内存泄漏,因为应用程序使用一次性分配的内存缓冲区来完成大部分工作。因此,我需要帮助理解:

  • 在.Net CF 3.5运行时,这种静默应用程序终止行为正常吗

  • 如何获取有关此“OutOfMemory”错误的更多详细信息


  • 你可能有内存泄漏。您应该周期性地将内存使用情况记录到一个文件中,其中包含您发出内存日志的代码位置的一些详细信息。如果应用程序在WM_HIBERNATE上没有反应,Windows CE将终止应用程序。WM_HIBERNATE是在程序内存不足时发送的。您还可以使用perfmon监控您的应用程序(请参阅中的详细信息),谢谢@josef。我们已经使用了.Net CF RPM(perfmon)工具,正如我在上面的问题中所附的快照所示,“GC后使用的托管字节”几乎保持不变(数百字节向上和向下)。WM_HIBERNATE是一个很好的指针。当我看到WM#U HIBERNATE/WM#U CLOSE消息是WindowsCE.Forms.MobileDevice的一部分时,如何在C#console应用程序中捕获WM#U HIBERNATE/WM#U CLOSE消息?WM#U HIBERNATE仅发送给Windows消息处理程序。由于perfmon不会显示所有内存,因此您可以使用内存记录器记录一段时间内所有进程的内存使用情况。在这里,托管字节的使用似乎还不够。