天天看點

Android C++層記憶體洩漏檢測

最近在Android項目中遇到C++層記憶體洩露問題,在此記錄解決方法。

1.修改C:\Users\<使用者名>\.android\ddms.cfg,在檔案的最後添加"native=true"。

Android C++層記憶體洩漏檢測
Android C++層記憶體洩漏檢測

2.連上真機并打開cmd指令行,執行以下幾步:

adb root //擷取root

adb shell setprop libc.debug.malloc 1 //設定檢測等級,這裡的1表示檢測記憶體洩露,其他參數可百度

adb shell stop

adb shell start

setprop libc.debug.malloc 1 這一步需要真機中有以下兩個檔案:/system/lib/libc_malloc_debug_leak.so 與 /system/lib/libc_malloc_debug_qemu.so。

可以使用adb shell進入shell模式檢視這兩個檔案是否存在(使用linux控制台指令)。

adb shell start這步之後可以使用 adb shell getprop檢視libc.debug.malloc有沒有設定為1。

3.打開ddms.bat,這個檔案在sdk/tools裡,我的路徑是F:\adt-bundle\sdk\tools\ddms.bat。

這裡的ddms和adt中的ddms不一樣,會多出一個native heap頁籤。

Android C++層記憶體洩漏檢測

左側的清單視窗會顯示真機中的所有程序,選擇需要檢測的程序(你的項目包名),

然後點下"Snapshot Current Native Heap Usage"按鈕,之後就會顯示native層的記憶體配置設定情況。

method那一欄會顯示進行配置設定記憶體的函數位址。

點選上圖中的"+-"按鈕,可以在每次點選"Snapshot"按鈕之後顯示記憶體增加情況。

定位到記憶體配置設定異常的那條,記錄下method的位址,然後通過下面幾步獲得具體函數。

Android C++層記憶體洩漏檢測

4.記錄左側的清單視窗中需要檢測的程序的pid,打開cmd指令行,輸入adb shell進入shell模式,再輸入 cat proc/pid/maps。

輸入之後會列印很多程序的符号表,找到你的.so的起始位址,例如:5f930000 - 6a000000 ..... libTest.so,

這裡的5f930000就是起始位址。如果libTest.so之前有多個位址,使用第一個(這個不确定,如果最終定位的函數很奇怪,

就試試其他的吧)。

Android C++層記憶體洩漏檢測

5.将D:\android-ndk-r9b\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin添加到環境變量PATH

中(這裡的目錄需要根據你的目标平台設定)。添加到PATH是為了友善使用這個目錄下的gdb,

也就是arm-linux-androideabi-gdb.exe這個。配置好後打開cmd指令行,輸入arm-linux-androideabi-gdb開啟gdb。

然後輸入 file <你的共享庫.so路徑>,gdb會載入共享庫的符号表。

計算真實函數位址0xXXXXXXXX = method位址 - 上一步得到的起始位址。 之後輸入 info symbol 0xXXXXXXXX 來定位函數。

通過以上步驟就可以定位到具體的函數了,如果有問題,歡迎留言。

參考網址:http://www.cnblogs.com/zdwillie/p/3287150.html(這篇的尋找method位址有誤)

http://www.360doc.com/content/14/0222/17/10366845_354796656.shtml