星期日, 11月 04, 2012

不能用valgrind,用mtrace總可以了吧!

在嵌入式系統上,因為valgrind並不支援armv5﹙但,支援armv7﹚,所以,在抓memory leak時,有時會porting到x86上用Valgrind掃一次,能找多少修多少。但,有時還是會發生慘案,在x86上掃不出,可是,放到板子上跑時,卻會memory leak。

儘管[1]舉出數個可應用在embedded systems上的detectors,但,找不到因不慎操作shared library產生的memory leak。比如,不斷呼叫GLib GListappend/prepend卻忘了釋放,雖然GLib支援透過環境變數改變GSlice行為,變為直接呼叫malloc。可是,像mtrace這類的工具,只會回報shared library裡面有呼叫malloc,但,卻無法透過addr2line找出memory leak的地方。

所以,產生了一個想法,自己寫一個簡單的shared library,透過掛載malloc hooks,在每一次malloc被呼叫時,使用backtrace找出當時的callstack,程式結束時,把結果寫到檔案。在搜尋撰寫library相關知識時發現,其實已經有人寫好了libmtrace,也可以卻實找出當下的callstack,算是符合當初預期的目標。太好了,省事多了XD

[1] Memory Leak Detection in Embedded Systems