Background: I am trying to track down a memory leak in a Xamarin.Android app. Using DDMS and Eclipse Memory Profiler, I am able to see which objects are alive. When trying to track what is holding them alive (GC Root), I only see "Native stack" (of course).
How can I take a heap snapshot of the MONO VM? So I can later use it with i.e. heapshot tool?
Or are there ANY OTHER TECHNIQUES I can use to find what is holding an object alive in Xamarin.Android's .NET part? Is it possible to do something from within the program?
How can I take a heap snapshot of the MONO VM? So I can later use it with i.e. heapshot tool?
It is now possible to get heap snapshots of the Mono VM (tested with Xamarin.Android 4.8.2 beta; may apply to prior releases, your mileage may vary). It's a four step process:
Enable heapshot logging:
adb shell setprop debug.mono.profile log:heapshot
Start your app. (If your app was already running before (1), kill and restart it.)
Use your app.
Grab the profile data for your app:
adb pull /data/data/@PACKAGE_NAME@/files/.__override__/profile.mlpd
@PACKAGE_NAME@
is the package name of your application, e.g. if your package is FooBar.FooBar-Signed.apk
, then @PACKAGE_NAME@
will be FooBar.FooBar
.
Analyze the data:
mprof-report profile.mlpd
mprof-report
is included with Mono.
Note: profile.mlpd
is only updated when a GC occurs, so you may want to call GC.Collect()
at some "well known" point to ensure that profile.mlpd
is regularly updated .
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With