execl 記憶體洩露跟蹤

2021-07-01 22:47:06 字數 1663 閱讀 3641

遇到了嵌入式linux下面系統級記憶體洩露問題。跟蹤問題日誌。

平台:arm9

核心:2.6.22

問題:execl造成系統記憶體減少,通過cat /proc/memoinfo 發現少的記憶體並且都移往slab中去了

測試**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main()

else if (pid == 0) //child

else

printf("%d\n", i); }

return 0; }

20091011:通過1000此呼叫之後,通過cat /proc/slabinfo對比發現,變化最大的是

name            : tunables : slabdata

size-256             120    120    256   15    1 : tunables  120   60    0 : slabdata      8      8      0

size-256            1120   1125    256   15    1 : tunables  120   60    0 : slabdata     75     75      0

計算,pagesperslab為1,即乙個page中有乙個slab,(75-8)×4k = 268k左右。為了排除其他部分造成的記憶體洩露。做了乙個測試,頻繁的進行1000次malloc和free,發現size-256項也無特別變化。可以初步判斷,應該是size-256塊slab中出現了記憶體沒有釋放的行為。下一步動作,研究源**do_execve部分來看分配192~256k的記憶體的嫌疑函式以及是否在退出後被釋放。

20091012:為了排除slab本身有bug的情況,將核心分配機制改為slub,結果,依然在執行1000次之後少出300k的記憶體空間。在slub.c中,static struct kmem_cache *get_slab(size_t size, gfp_t flags)函式中插入log,這裡是分配的必經之路。當分配的大小在128~256之間時,log出分配的size大小。執行測試程式,發現

_debug: get slab size = 192

_debug: get slab size = 208

就是說有分配192和208的需求在。

而簡單的ls,或pwd都會列印這個出來,本人據此推斷,分析進行shell命令也會有記憶體洩露問題。手動ls100次,果不其然,大概有52k的記憶體洩露,平均起來就是2個256的空間沒有收回。

對log的出處一直跟蹤(callstack),發現最終鎖定在load_elf_binary這個函式中,仔細看了code,發現log不是很規範,與同事交流了,原來被touch過。立即找到kmalloc和kfree的地方,看哪個kfree有沒有漏掉,果然發現漏洞。去對比2.6.22歷史版本,發現同事的修改有個地方忘記free了,興奮之餘,趕緊改過來,測試5000次。結果正常。原來這個新增的code是同事用來除錯用的,忘記砍掉了。我說呢,核心應該沒有這樣明顯的錯誤的,google也無任何關於此的問題。經過此次跟蹤後,對核心記憶體分配更加理解。

記憶體洩露檢測

c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...

檢測記憶體洩露

程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...

記憶體洩露檢測

1 包含標頭檔案 include include 2 每個cpp檔案包含 static char this file file define new new normal block,this file,line 3 設定標誌 int tmpdbgflag tmpdbgflag crtsetdbgf...