[英]How to work with Xamarin.Android/iOS/Mono and SPP over Bluetooth?
[英]How to take heap snapshot of Xamarin.Android's Mono VM?
背景:我试图在Xamarin.Android应用程序中追踪内存泄漏。 使用DDMS和Eclipse Memory Profiler,我能够看到哪些对象是活着的。 当试图追踪持有它们的东西(GC Root)时,我只看到“原生堆栈”(当然)。
如何获取MONO VM的堆快照? 所以我以后可以使用ie快照工具?
或者是否有任何其他技术我可以用来找到Xamarin.Android的.NET部分中持有物体的东西? 是否可以在程序中做一些事情?
如何获取MONO VM的堆快照? 所以我以后可以使用ie快照工具?
现在可以获得Mono VM的堆快照(使用Xamarin.Android 4.8.2 beta进行测试;可能适用于之前的版本,您的里程可能会有所不同)。 这是一个四步过程:
启用快照记录:
adb shell setprop debug.mono.profile log:heapshot
启动你的应用。 (如果您的应用程序在(1)之前已经运行,请终止并重新启动它。)
使用您的应用。
获取应用的个人资料数据:
adb pull /data/data/@PACKAGE_NAME@/files/.__override__/profile.mlpd
@PACKAGE_NAME@
是您的应用程序的包名称,例如,如果您的包是FooBar.FooBar-Signed.apk
,那么@PACKAGE_NAME@
将是FooBar.FooBar
。
分析数据:
mprof-report profile.mlpd
mprof-report
中包含mprof-report
。
注意 : profile.mlpd
仅在GC发生时更新,因此您可能希望在某个“众所周知”的位置调用GC.Collect()
以确保定期更新profile.mlpd
。
我一直在使用Xamarin Android内存分析遇到麻烦,并使用了一些技巧:
在Dalvik方面,我使用Android Monitor转储堆快照,然后使用JProfiler或Eclipse MAT打开它。 这个标准Android。
我的代码的很大一部分是共享的(70-80%),为了验证这一点,我构建了一个简单的WinForms应用程序来驱动共享API。 这样我可以使用.Net Memory Profiler(或者你喜欢的ANTS)以及dotTrace的性能。 我可以通过这种方式轻松选择一些问题。
通过使用上面@jnop解释的解决方案,我可以在Mono的HeapShot工具中打开profile.mldp并获得可视化工具而不是mprof-report文本输出。
顺便说一句,应该投票给更好的剖析师: http : //xamarin.uservoice.com/forums/144858-xamarin-suggestions/suggestions/3229534-add-memory-and-performance-profiler
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.