轉載請注明出處:https://www.cnblogs.com/zzcperf/p/9563389.html
Android 檢測 C/C++內存泄漏的方法越來越簡便了,下面列舉一下不同場景下檢測C/C++內存泄漏的方法。
在介紹檢查方法之前,先把一個技巧說在前頭。因為打開檢測開關,會嚴重影響手機性能,所以最好使用32位手機來檢測,32位手機會順暢一點。
Android 7.x / 8.x(針對root設備,調試安卓APP)
1. 准備一個userdebug或eng版本手機,盡量選擇32bit機器,64bit設備會非常卡,libc_malloc_debug.so需要編譯進去,下載native_heapdump_viewer.py腳本備用
2. 打開debug開關。
1)如果是Android 8.x,執行以下命令
adb shell setprop wrap.<APP_PACKAGE_NAME> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'
adb shell am force-stop <APP_PACKAGE_NAME>
2)如果是Android 7.x (8.x 也可以用),執行以下命令,其中app_process照寫,不需要針對調試的app更改
adb root adb shell stop adb shell setprop lib.debug.malloc.program app_process adb shell setprop lib.debug.malloc.options "\"backtrace leak_track\""
adb shell start
3. 執行重現路徑N次
4. 執行以下命令,其中/path/to/symbols/是指存放帶有符號信息so文件的文件夾,默認是$ANDROID_PRODUCT_OUT/symbols。
adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt adb shell pull /data/local/tmp/heap.txt python development/scripts/native_heapdump_viewer.py --html --symbols /path/to/symbols/ heap.txt > heap_info.html
5. 不重啟手機,繼續重復第三、第四步,對比兩次生成的heap_info.html
Android 5.x - 7.x(針對root設備,調試Native進程)
Google的調試方法可以參考這里,Google的方法在不斷完善中,遇到問題或需要更靈活的調試方法時,可以使用下面的庫。
ChkMemLeak庫只有一個函數checkLeak,每次調用該函數,都輸出當前進程尚未釋放的內存。
對比多次輸出結果,排查可疑的內存泄漏。
1. 將ChkMemLeak庫添加到系統代碼中。
2. 在需要調試的代碼中包含頭文件,調用checkLeak();在Android.mk(或.bp)動態庫libcheckleak。
注意不要在線程的死循環中調用,否則會導致性能問題。
3. 打開debug開關
如果是Android 7.x / 8.x,執行以下命令
adb root
adb shell stop
adb shell setprop lib.debug.malloc.program 進程名
adb shell setprop lib.debug.malloc.options "\"backtrace leak_track\""
adb shell start
如果是Android 5.x / 6.x,執行以下命令
adb root adb shell setprop libc.debug.malloc=1 adb shell stop adb shell start
4. 執行調用checkLeak()的操作路徑,每調用一次,都會在 /data 目錄生成 checkleak_PID_timestamp.csv
size, duplications, backtrace三列分別是單次分配大小、分配次數,調用棧
找到可疑的分配路徑后,使用addr2line工具找到對應的代碼位置。
Android 4.x或之前版本(針對root設備,調試Native進程)
這么老的OS應該很少用了,解析調用棧的頭文件是/android/system/core/include/corkscrew/backtrace.h
有需要的同學可以參照ChkMemLeak實現一下。
