LeakTracer使用教程

搜狗測試2019-06-16 13:38:29

LeakTracer使用教程





在進行評測工具的開發時,發現最終跑出來的內存曲線如下圖所示。呈緩慢的增長趨勢,但是在代碼review的時候,並未發現有明顯的內存泄漏問題,為排查這個問題,決定在評測工具中引入基於NDK的C++內存檢查工具LeakTracer(其實還有其他的同類型檢測工具如Valgrind等),在這裏介紹下這個工具的基本使用方法。


工具的下載



工具的下載:


説明網站:

http://www.andreasen.org/LeakTracer/


下載地址:https://github.com/fredericgermain/LeakTracer


下載後結構如下:

1. helpers中封裝的是helper工具,在其中評測項目中用到了leak-analyze-addr2line腳本用於解析產生的內存泄漏文件。

2. test中提供輔助瞭解代碼的測試文件

3. libleaktracer中存放主要的lib文件



工具的使用


有兩種方法可以將LeakTracer引入項目中:


1. 將自己的程序與libleaktracer進行鏈接,也就是將自己的程序一個靜態鏈接庫libleaktracer進行鏈接,靜態鏈接是會將庫的代碼揉進我們自己項目的目標代碼so中的。

2. 利用項目中提供的makefile文件,將自己的程序與libleaktracer.so進行鏈接。需要將-lleaktracer選項做為鏈接命令的第一個選項。


在內核評測工具中,使用的是第一種方法,把LeakTracer拷貝到項目中,並在cmake文件中添加以下説明:



sync並且build項目成功,證明LeakTracer已經成功引入到項目中。想要使用這個工具,需要以下兩個步驟:


  1. 在運行時啟動trace記錄


  1. 在程序結束時,關閉trace,並且將memory leak寫入指定文件。

這個時候發現我們的手機中已經有了內存泄漏文件。

內部文件的格式如下所示:



文件的解析



既然有了沒被正確釋放的內存分配時候的棧信息,那就將它們轉換到代碼文件的行數吧。LeakTracer/helpers下的leak-analyze-addr2line工具就可以幫我們完成這些。

 

執行命令:

perl leak-analyze-addr2line /Users/apple/Downloads/A8.28/core_project/test/android/rt_launcher/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libCoreTest.so leaks.out

 

此處需注意leak-analyze-addr2line是perl腳本,一直以為是sh腳本,一直在報錯,直到看了原文件, 需配置perl環境,並將perl添加進環境目錄。


命令執行完畢後發現地址解析異常如下:

found166 leak(s)

252 bytes lost in 9 blocks (one of them allocated at 9084.533162), from following call stack:

??:0

??:0

??:0

??:0

??:0


排查原因,説明內存地址都是進程地址空間的絕對地址,動態鏈接庫在每次加載是都可能被映射在進程內存地址空間的不同位置,因而addr2line無法根據符號的地址空間絕對地址轉換到代碼行數。


如果手動轉換的話,需要先通過/proc/[pid]/maps找到我們的動態鏈接庫映射的內存基地址,然後算出backtrace每個地址對應的動態鏈接庫內部的偏移地址,再通過addr2line來將內存地址轉換到代碼文件的行號,比較繁瑣;在網上找到了解決方案,在記錄時地址信息時,同時獲取library映射到的內存的基地址即可。


在MemoryTrace::init_no_alloc_allowed()中添加以下句子:

再次執行命令,文件解析成功,內存問題展示如下:


需要注意的是,不是全部輸出的問題都是內存泄漏問題,有可能代碼封裝好在程序結束時自動釋放,這種現象也會被當成是內存泄漏問題而被指出;並且使用LeakTracer,會使程序變慢,不建議與其他評測程序共同執行。






https://hk.wxwenku.com/d/200890713