2013-10-01 48 views
5

背景:我試圖追查Xamarin.Android應用程序中的內存泄漏。使用DDMS和Eclipse Memory Profiler,我可以看到哪些對象是活着的。當試圖追蹤讓他們活着的東西時(GC Root),我只能看到「本地堆棧」(當然)。如何獲取Xamarin.Android的Mono VM的堆快照?

如何獲取MONO虛擬機的堆快照?所以我可以在以後使用它,即heapshot工具?

或者是否有任何其他技術我可以用它來查找Xamarin.Android的.NET部件中是否存在活着的對象?是否有可能在程序內部做些什麼?

回答

10

如何獲取MONO虛擬機的堆快照?所以我可以在以後使用它,即heapshot工具?

現在可以獲得Mono VM的堆棧快照(使用Xamarin.Android 4.8.2測試;可能適用於之前版本,您的里程可能會有所不同)。這四個步驟:

  1. 啓用heapshot記錄:

    adb shell setprop debug.mono.profile log:heapshot 
    
  2. 啓動應用程序。 (如果您的應用程序已在(1)之前運行,請將其重新啓動。)

    使用您的應用程序。

  3. 搶你的應用程序的配置文件數據:

    adb pull /data/data/@[email protected]/files/.__override__/profile.mlpd 
    

    @[email protected]是你的應用程序,例如的包名如果您的包裹是FooBar.FooBar-Signed.apk,那麼@[email protected]將是FooBar.FooBar

  4. 分析數據:

    mprof-report profile.mlpd 
    

    mprof-report附帶單聲道。

注意profile.mlpd只有當GC發生更新,所以你可能想打電話GC.Collect()在一些「衆所周知」的點,以確保profile.mlpd定期更新。

+0

兩個選項mprof報告可能有用:'--traces'列出持有對象的引用堆上的類型併爲每個參考計數。 '--verbose'產生一個更完整的引用列表,mprof-report默認縮寫列表。 – joates

+0

它也可以在設備上進行調試時工作嗎? –

+0

有沒有關於mlpd文件格式的任何文檔?或從日誌文件中獲取計算機可讀數據的方法? –

4

我一直有與Xamarin的Android內存分析的煩惱,並使用了一些技巧:

  1. 在我使用Android的監視器轉儲堆快照的Dalvik側,然後用JProfiler的或打開它Eclipse MAT。這個標準的Android。

  2. 我的代碼的很大一部分是共享的(70-80%),並驗證我已經構建了一個簡單的WinForms應用程序來驅動共享API。通過這種方式,我可以使用.Net Memory Profiler(或者如果您願意,可以使用ANTS)以及dotTrace來提高性能。我可以通過這種方式輕鬆地選擇不少問題。

  3. 通過使用上面的@jnop解釋的解決方案,我可以在Mono的HeapShot工具中打開profile.mldp,並獲得一個可視工具而不是mprof-report文本輸出。

通過使用要選更好的剖析方式: http://xamarin.uservoice.com/forums/144858-xamarin-suggestions/suggestions/3229534-add-memory-and-performance-profiler

+0

謝謝!只是投了票。 – badbadboy