GLiBC的malloc hook

 剛看了一個大牛的博客,介紹了一下glibc的“內存泄漏”的定位過程,覺得對今後實際碰到的問題有一定的參考作用,故在此複述一下,供自己今後參考。

問題重現:使用glibc下的malloc分配內存10G,後調用free後,發現進程的內存還是佔用10G,有時候佔用8G,有時候佔用3G,不太穩定,有內存泄漏的嫌疑

於是開始經過長時間苦逼的定位過程,發現了glibc一個有趣的特性,

glibc在128KB大小一下的內存採取brk操作,大於128KB後會採取mmap來分配內存。

brk分配的內存,在後面分配的內存不釋放的情況下,前面分配的內存也是不會釋放的,如連續地址分配A和B兩塊內存,如果B不釋放,A也不會釋放

具體可以去google一下brk和mmap的分配方式的區別

glibc的對128KB是有一個控制位,是動態修改的,M_MMAP_THRESHOLD,如作者在分配時,一次分配了2MB的內存,那麼這個值就被修改爲了2MB ~ 2MB + 4KB 中間一個值,因此後面的分配內存都採取了brk操作,導致最後看到的free後,內存卻得不到釋放的假想

這與glibc的內存方式有關。

 

後面還提到了對內存分析的一個程序集工具,也是由glibc提供的malloc hook, 大致意思是可以捕獲malloc和free等操作,然後替換爲自己定位的操作,如可以在內存打印一些語句,來分析內存分配情況,具體可以google之。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章