我使用了CF Remote Performance Monitor,但这似乎只跟踪托管世界中初始化的内存,而不是非托管世界。好吧,我只能假设这个,因为探查器中列出的数字远远超过允许的最大数量(CE 5上为32mb)。使用RPM分析特定应用程序向我展示了所有缓存的总使用量只能达到大约12mb,然后慢慢收缩,因为(我假设)非托管的东西开始占用更多内存。 系统中的内存滑块还显示设备内存非常短。如果我终止该过程,滑块会显示所有内存返回。因此,必须(?)这个吞噬内存的托管进程。
有没有简单的(ish?)方式如何以某种方式跟踪非托管内存使用情况,这可能使我能够将其与相应的P / Invoke调用相匹配?
编辑:对于所有你重新标记它不是.NET ,标记这样的问题会让事情变得混乱。它是.NETCF / Compact Framework。我知道它们看起来很相似,但它们是不同的,因为.NET摇滚,而CF基本上只是NotImplementedException的包装。
答案 0 :(得分:3)
尝试启用Interop logging。
此外,如果您有权访问您正在使用的原生dll的代码,请查看以下内容:http://msdn.microsoft.com/en-us/netframework/bb630228.aspx
答案 1 :(得分:1)
我一直在C#托管应用中与非托管问题作斗争一段时间 - 这并不容易。
我发现最有用的是定期输出文本日志文件。例如,您可以每隔几分钟打印GlobalMemoryStatus的输出,并在每次加载新表单时记录。从那里你至少可以看到记忆逐渐消失,或者在一天中的特定时间消失了大量的记忆。
对于我们来说,只要设备被使用,我们就会发现整天都在逐渐失去记忆力。从那里我们最终发现条形码扫描设备在我们的Form基类中没有特殊原因进行初始化(我责怪以前的开发人员!: - )
设置此日志记录可能是一个小麻烦,但对于我们来说,从长远来看它带来了巨大的好处,特别是在实时使用的设备中,我们可以获得真实的数据,工具,来自异常的堆栈跟踪等。
答案 2 :(得分:1)
好的,我在CE上使用C ++,而不是C#,所以这可能没有帮助,但是......
我使用名为Entrk toolbox的包来监视Windows CE下的内存和资源使用,泄漏和异常。非常像一个轻量级的CE版本的boundschecker。最常见的伎俩。