6

我使用了 CF Remote Performance Monitor,但是这似乎只跟踪在托管世界中初始化的内存,而不是在非托管世界中。好吧,我只能假设这是因为探查器中列出的数字远低于允许的最大值(CE 5 上为 32mb)。使用 RPM 对特定应用程序进行分析表明,所有缓存的总使用量只能达到 12mb 左右,然后随着(我假设)一些非托管的东西开始占用更多内存而慢慢缩小。系统中的内存滑块还显示设备内存非常不足。如果我终止进程,滑块会显示所有内存都回来了。所以它必须(?)是这个吞噬内存的托管进程。

是否有任何简单(ish?)的方式可以以某种方式跟踪非托管内存使用情况,这可能使我能够将其与相应的 P/Invoke 调用相匹配?

编辑:对于所有重新标记的人来说,它不是 .NET,像这样标记问题会使事情变得混乱。它是 .NETCF / Compact Framework。我知道它们看起来很相似,但它们不同,因为 .NET 摇滚,而 CF 基本上只是 NotImplementedException 的包装器。

4

3 回答 3

3

尝试启用互操作日志记录

此外,如果您可以访问您正在使用的本机 dll 的代码,请查看:http: //msdn.microsoft.com/en-us/netframework/bb630228.aspx

于 2008-08-13T20:33:46.253 回答
1

一段时间以来,我肯定一直在与 C# 托管应用程序中的非托管问题作斗争——这并不容易。

我发现最有用的是定期输出到文本日志文件。例如,您可以 每隔几分钟打印一次GlobalMemoryStatus的输出,并在每次加载新表单时进行记录。从那里你至少可以看到要么记忆逐渐消失,要么一大块记忆在一天中的特定时间消失了。

对我们来说,只要使用该设备,我们就会发现一整天的记忆力逐渐丧失。从那里我们最终发现条形码扫描设备在我们的 Form 基类中没有特别的原因被初始化(我责怪以前的开发人员!:-)

设置此日志记录可能是一个小麻烦,但从长远来看,它为我们带来了巨大的好处,特别是在实时使用的设备上,我们可以获得真实数据、检测、异常堆栈跟踪等。

于 2008-08-14T16:06:04.087 回答
1

好的,我在 CE 上使用 C++,而不是 C#,所以这可能没有帮助,但是......

我使用了一个名为Entrk toolbox的包,它在 Windows CE 下监视内存和资源的使用、泄漏和异常。很像一个轻量级的 CE 版本的边界检查器。大多数时候都在做这个把戏。

于 2008-09-27T11:35:15.200 回答