精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何通過wrap malloc定位C/C++程序的內存泄漏

開發 后端
用C/C++開發的程序執行效率很高,但卻經常受到內存泄漏的困擾。本文提供一種通過wrap malloc查找memory leak的思路。

用C/C++開發的程序執行效率很高,但卻經常受到內存泄漏的困擾。本文提供一種通過wrap malloc查找memory leak的思路。

[[278147]]

什么是內存泄漏?

動態申請的內存丟失引用,造成沒有辦法回收它(我知道杠jing要說進程退出前系統會統一回收),這便是內存泄漏。

Java等編程語言會自動管理內存回收,而C/C++需要顯式的釋放,有很多手段可以避免內存泄漏,比如RAII,比如智能指針(大多基于引用計數計數),比如內存池。

理論上,只要我們足夠小心,在每次申請的時候,都牢記釋放,那這個世界就清凈了,但現實往往沒有那么美好,比如拋異常了,釋放內存的語句執行不到,又或者某菜鳥程序員不小心埋了一個雷,所以,我們必須直面真實的世界,那就是我們會遭遇內存泄漏。

怎么查內存泄漏?

我們可以review代碼,但從海量代碼里找到隱藏的問題,這如同大海撈針,往往兩手空空。

所以,我們需要借助工具,比如valgrind,但這些找內存泄漏的工具,往往對你使用動態內存的方式有某種期待,或者說約束,比如常駐內存的對象會被誤報出來,然后真正有用的信息會掩蓋在誤報的汪洋大海里。很多時候,甚至valgrind根本解決不了日常項目中的問題。

所以很多著名的開源項目,為了能用valgrind跑,都費大力氣,大幅修改源代碼,從而使得項目符合valgrind的要求,滿足這些要求,用vargrind跑完沒有任何報警的項目叫valgrind干凈。

既然這些玩意兒都中看不中用,所以,求人不如求己,還是得自力更生。

什么是動態內存分配器?

動態內存分配器是介于kernel跟應用程序之間的一個函數庫,glibc提供的動態內存分配器叫ptmalloc,它也是應用最廣泛的動態內存分配器實現。

從kernel角度看,動態內存分配器屬于應用程序層;而從應用程序的角度看,動態內存分配器屬于系統層。

應用程序可以通過mmap系統直接向kernel申請動態內存,也可以通過動態內存分配器的malloc接口分配內存,而動態內存分配器會通過sbrk、mmap向kernel分配內存,所以應用程序通過free釋放的內存,并不一定會真正返還給系統,它也有可能被動態內存分配器緩存起來。

google有自己的動態內存分配器tcmalloc,另外jemalloc也是著名的動態內存分配器,他們有不同的性能表現,也有不同的緩存和分配策略。你可以用它們替換linux系統glibc自帶的ptmalloc。

new/delete跟malloc/free的關系

new是c++的用法,比如Foo *f = new Foo,其實它分為3步。

  • 通過operator new()分配sizeof(Foo)的內存,最終通過malloc分配。
  • 在新分配的內存上構建Foo對象。
  • 返回新構建的對象地址。

new=分配內存+構造+返回,而delete則是等于析構+free。

所以搞定malloc、free就是從根本上搞定動態內存分配。

1. chunk

每次通過malloc返回的一塊內存叫一個chunk,動態內存分配器是這樣定義的,后面我們都這樣稱呼。

2. wrap malloc

gcc支持wrap,即通過傳遞-Wl,--wrap,malloc的方式,可以改變調用malloc的行為,把對malloc的調用鏈接到自定義的__wrap_malloc(size_t)函數,而我們可以在__wrap_malloc(size_t)函數的實現中通過__real_malloc(size_t)真正分配內存,而后我們可以做搞點小動作。

同樣,我們可以wrap free。malloc跟free是配對的,當然也有其他相關API,比如calloc、realloc、valloc,但這根本上還是malloc+free,比如realloc就是malloc + free。

怎么去定位內存泄漏呢?

我們會malloc各種不同size的chunk,也就是每種不同size的chunk會有不同數量,如果我們能夠跟蹤每種size的chunk數量,那就可以知道哪種size的chunk在泄漏。很簡單,如果該size的chunk數量一直在增長,那它很可能泄漏。

光知道某種size的chunk泄漏了還不夠,我們得知道是哪個調用路徑上導致該size的chunk被分配,從而去檢查是不是正確釋放了。

怎么跟蹤到每種size的chunk數量?

我們可以維護一個全局 unsigned int malloc_map[1024 * 1024]數組,該數組的下標就是chunk的size,malloc_map[size]的值就對應到該size的chunk分配量。

這等于維護了一個chunk size到chunk count的映射表,它足夠快,而且它可以覆蓋到0 ~ 1M大小的chunk的范圍,它已經足夠大了,試想一次分配一兆的塊已經很恐怖了,可以覆蓋到大部分場景。

那大于1M的塊怎么辦呢?我們可以通過log記錄下來。

  • 在__wrap_malloc里,++malloc_map[size]
  • 在__wrap_free里,--malloc_map[size]

很簡單,我們通過malloc_map記錄了各size的chunk的分配量。

如何知道釋放的chunk的size?

不對,free(void *p)只有一個參數,我如何知道釋放的chunk的size呢?怎么辦?

我們通過在__wrap_malloc(size_t)的時候,分配8+size的chunk,也就是多分配8字節,開始的8字節存儲該chunk的size,然后返回的是(char*)chunk + 8,也就是偏移8個字節返回給調用malloc的應用程序。

這樣在free的時候,傳入參數void* p,我們把p往前移動8個字節,解引用就能得到該chunk的大小,而該大小值就是前一步,在__wrap_malloc的時候設置的size。

好了,我們真正做到記錄各size的chunk數量了,它就存在于malloc_map[1M]的數組中,假設64個字節的chunk一直在被分配,數量一直在增長,我們覺得該size的chunk很有可能泄漏,那怎么定位到是哪里調用過來的呢?

如何記錄調用鏈?

我們可以維護一個toplist數組,該數組假設有10個元素,它保存的是chunk數最大的10種size,這個很容易做到,通過對malloc_map取top 10就行。

然后我們在__wrap_malloc(size_t)里,測試該size是不是toplist之一,如果是的話,那我們通過glibc的backtrace把調用堆棧dump到log文件里去。

注意:這里不能再分配內存,所以你只能使用backtrace,而不能使用backtrace_symbols,這樣你只能得到調用堆棧的符號地址,而不是符號名。

如何把符號地址轉換成符號名,也就是對應到代碼行呢?

addr2line

addr2line工具可以做到,你可以追查到調用鏈,進而定位到內存泄漏的問題。

至此,你已經get到了整個核心思想。

當然,實際項目中,我們做的更多,我們不僅僅記錄了toplist size,還記錄了各size chunk的增量toplist,會記錄大塊的malloc/free,會wrap更多的API。

總結一下:通過wrap malloc/free + backtrace + addr2line,你就可以定位到內存泄漏了。

 

責任編輯:趙寧寧 來源: 碼磚雜役
相關推薦

2011-06-16 09:28:02

C++內存泄漏

2025-05-26 04:00:00

2024-12-19 14:42:15

C++內存泄漏內存管理

2015-04-17 10:35:51

c++c++程序內存泄漏檢測代碼

2010-01-28 10:33:10

C++開發程序

2020-11-02 09:48:35

C++泄漏代碼

2010-01-25 18:15:52

2010-01-25 14:56:08

C++程序

2023-12-27 13:55:00

C++內存分配機制new

2025-10-27 01:33:00

2010-01-26 15:51:06

C++變量

2021-11-08 12:44:48

AndroidC++內存

2020-05-26 13:25:00

語言編譯代碼

2011-04-11 09:47:50

C++內存管理

2025-08-19 09:30:34

2024-05-06 11:19:20

內存池計算機編程

2025-11-05 07:08:00

C/C++內存泄漏代碼

2024-01-09 09:23:12

指針C++

2011-05-13 18:10:55

CC++

2010-01-26 17:27:58

C++C程序
點贊
收藏

51CTO技術棧公眾號

懂色av噜噜一区二区三区av| 樱花草涩涩www在线播放| 精品一区二区综合| 久久久久久午夜| 欧美色图亚洲激情| 一区在线不卡| 欧美色播在线播放| 一区二区三区一级片| 全国男人的天堂网| 久久99热这里只有精品| 亚州精品天堂中文字幕| 亚洲ⅴ国产v天堂a无码二区| 五月亚洲婷婷| 欧美日韩午夜影院| 日本一本中文字幕| 欧美午夜电影一区二区三区| 成人中文字幕电影| 国产日韩欧美中文| 国产成人精品网| 一区二区日韩欧美| 国产一区二区三区18| yjizz视频| 国产精品2区| 欧美亚洲国产一区在线观看网站 | 国产欧美日韩精品一区二区三区 | 色综合久久久无码中文字幕波多| 免费电影日韩网站| 亚洲国产精品精华液网站| 亚洲精品成人久久久998| 色猫av在线| 成人午夜av在线| 亚洲精品欧美极品| 亚洲视频在线免费播放| 天堂精品中文字幕在线| 69久久夜色精品国产69| 国产一级av毛片| 欧美在线三区| 久久精品电影一区二区| 蜜臀久久99精品久久久久久| 亚洲精品无吗| 亚洲精品第一页| 中文字幕乱视频| 在线视频亚洲欧美中文| 欧美一卡二卡三卡| www.桃色.com| 日韩激情欧美| 欧美一级免费观看| 性生活一级大片| 96视频在线观看欧美| 欧美日韩精品一二三区| 亚洲欧美自偷自拍另类| 69堂精品视频在线播放| 欧洲av在线精品| 九九九在线观看视频| 欧美日韩五区| 欧美色视频在线| 免费在线观看污网站| 亚洲国产91视频| 宅男噜噜噜66一区二区66| 超碰人人草人人| 日本超碰一区二区| 亚洲国产成人精品一区二区| 国产精品久久久久久亚洲色 | 日韩激情电影免费看| 午夜成人在线视频| 久久国产乱子伦免费精品| 暖暖成人免费视频| 欧美日韩亚洲不卡| 亚洲av无码成人精品区| 欧美三级自拍| 国产亚洲视频在线观看| 天天看天天摸天天操| 国产精品久久| 91极品女神在线| 中文天堂在线资源| 国产乱码一区二区三区| 国产另类第一区| 欧美美女搞黄| 综合中文字幕亚洲| 国产视频九色蝌蚪| 播放一区二区| 日韩欧美国产综合一区| 亚洲调教欧美在线| 色综合蜜月久久综合网| 欧美成年人网站| 亚洲第一精品在线观看| 免费成人你懂的| 国产99在线免费| 理论在线观看| 亚洲精品视频一区| 日本熟妇人妻xxxxx| 久久99国产精品二区高清软件| 日韩欧美卡一卡二| 久久精品无码一区| 欧美视频日韩| 国产成人一区二区在线| 精品国产伦一区二区三区| 26uuu国产电影一区二区| 亚洲制服中文| 中文在线免费视频| 日韩三级视频在线观看| 欧美人与性囗牲恔配| 国产精品www.| 国产精品视频大全| 天堂资源中文在线| 一区二区久久久久久| 日韩福利视频在线| 欧美一区自拍| 色与欲影视天天看综合网| 中文字幕一区二区三区四区免费看 | 久久国产精品亚洲人一区二区三区 | 欧美精品一区二区蜜桃| 免费看欧美女人艹b| 国产一区精品视频| 色呦呦视频在线观看| 欧美日韩在线免费视频| 一区二区三区免费在线观看视频| 一区二区三区国产精华| 国产精品美乳一区二区免费| 日日躁夜夜躁白天躁晚上躁91| 国产精品成人一区二区三区夜夜夜| 国产综合av在线| 日韩视频1区| 久久精品国产2020观看福利| 黄色一区二区视频| 国产亚洲va综合人人澡精品| 777精品久无码人妻蜜桃| 一区二区三区在线免费看| www.99久久热国产日韩欧美.com| 天天操天天干天天摸| 91亚洲精品久久久蜜桃网站| 黄色激情在线视频| 亚洲一区二区免费在线观看| 久久天天躁狠狠躁夜夜av| 超碰在线免费97| 国产日韩欧美一区二区三区综合| 无码人妻丰满熟妇区96| 国产亚洲精品美女久久| 欧美极品美女电影一区| 亚洲免费视频网| 亚洲综合视频网| 韩国三级在线看| 国产精品成人一区二区网站软件| 91久久国产自产拍夜夜嗨| 成人免费网站在线观看视频| 欧美人与性动xxxx| 乱老熟女一区二区三区| 六月丁香婷婷色狠狠久久| 亚洲ai欧洲av| 青青在线精品| 欧美精品一区三区| 成 人片 黄 色 大 片| 亚洲国产乱码最新视频| 99久久人妻精品免费二区| 亚洲乱码久久| 日本一区二区在线| 日本h片久久| 久久久精品亚洲| 朝桐光av在线一区二区三区| 亚洲成a人v欧美综合天堂| 漂亮人妻被黑人久久精品| 午夜在线观看免费一区| 三区精品视频| 日韩伦理一区二区| 精品自在线视频| 天天色棕合合合合合合合| 日韩欧美在线看| 欧美激情久久久久久久| 国产一区二区视频在线| 国产乱子伦精品无码专区| 国产精品自在| 国产精品电影观看| 久久日韩视频| 亚洲福利视频网站| 国产成人无码专区| 亚洲欧洲日韩在线| 男人的天堂影院| 奇米精品一区二区三区四区| 伊人网在线免费| 全球av集中精品导航福利| 国产精品第一页在线| av电影免费在线观看| 亚洲精品成人久久电影| 中文字幕在线观看你懂的| 一区二区三区精品在线观看| 久久人人爽人人人人片| 久久成人av少妇免费| 成人在线观看你懂的| jizzjizz欧美69巨大| 懂色一区二区三区av片| 99久久婷婷国产综合精品首页 | 青青青在线视频| 国产日韩欧美制服另类| 亚洲v在线观看| 免费人成精品欧美精品| 日韩人妻无码精品久久久不卡| 精品国产91乱码一区二区三区四区| 91精品国产自产在线老师啪| 精品三级久久| 美女少妇精品视频| 国产片在线观看| 亚洲成**性毛茸茸| 91丨porny丨在线中文 | 国产精品青草久久久久福利99| 亚洲小说区图片| 国产午夜精品全部视频在线播放| www.av日韩| 欧美高清性hdvideosex| 欧美日韩乱国产| 一区二区在线免费| av资源在线免费观看| 99在线视频精品| 激情在线观看视频| 日本成人在线不卡视频| 奇米精品一区二区三区| 国产精品二区影院| 自拍偷拍视频在线| 成人看的视频| 欧美大香线蕉线伊人久久国产精品| 国产一区一区| 成人黄色影片在线| 欧美亚洲人成在线| 国产精品久久久久不卡| 中文字幕在线视频久| 午夜精品理论片| 黑人极品ⅴideos精品欧美棵| 久久精品国产免费观看| av在线免费观看网| 国产亚洲美女久久| 日本视频在线观看一区二区三区| 亚洲福利影片在线| 丰满人妻熟女aⅴ一区| 日韩午夜中文字幕| 精品人妻一区二区三区麻豆91| 777奇米四色成人影色区| 亚洲天堂自拍偷拍| 欧美日韩亚洲综合一区二区三区 | 国产在线精彩视频| 久久久噜久噜久久综合| 牛牛精品在线视频| 高清欧美性猛交xxxx| 爱情岛亚洲播放路线| 国外色69视频在线观看| 久久香蕉av| 国语对白做受69| 欧美13videosex性极品| 4k岛国日韩精品**专区| 芒果视频成人app| 国产精品999999| 成人久久网站| 成人高清视频观看www| av国产精品| y111111国产精品久久婷婷| 91麻豆精品激情在线观看最新| 国产99视频精品免费视频36| 久久精品色播| 欧美日韩在线高清| 日韩dvd碟片| 少妇高潮大叫好爽喷水| 欧美91福利在线观看| 男人添女荫道口图片| 亚洲美女黄网| 欧美视频免费播放| 麻豆精品在线播放| 久久久久亚洲av无码网站| av欧美精品.com| 婷婷色一区二区三区| 中文字幕一区二区三中文字幕| 国产67194| 亚洲国产乱码最新视频 | 久久福利免费视频| 夜夜夜精品看看| 4438国产精品一区二区| 欧美图片一区二区三区| www.蜜臀av| 亚洲欧美综合另类中字| 成人高清免费在线| 91精品国产自产91精品| 91av一区| 国产日韩欧美一区二区| 人人狠狠综合久久亚洲婷| 亚洲中文字幕无码一区二区三区| 国产亚洲午夜| 日韩va在线观看| 91美女片黄在线| 一起操在线播放| 色综合色综合色综合色综合色综合| 亚洲中文字幕在线观看| 欧美成人一区二区三区在线观看| 日本v片在线免费观看| 久久久国产视频91| 亚洲第一二三四区| 99久re热视频这里只有精品6| 亚洲自拍电影| 国产青草视频在线观看| 男女视频一区二区| 成人无码www在线看免费| 亚洲视频你懂的| 中文字幕在线天堂| 亚洲国产日韩精品在线| 18加网站在线| 国产精品999999| 四虎5151久久欧美毛片| 国产香蕉一区二区三区| 日韩成人精品在线| 538国产视频| 亚洲一区在线电影| 国产又大又黑又粗| 在线观看久久av| 日本在线影院| 国产伦精品一区二区三区四区视频 | 中文字幕av片| 亚洲欧美日韩高清| av今日在线| 国产精品区一区二区三在线播放| 久久亚洲专区| www.99在线| 久久久噜噜噜久久中文字幕色伊伊| 免费视频网站www| 678五月天丁香亚洲综合网| av小片在线| 国产精品高潮在线| 亚洲ab电影| 欧美黄色免费影院| 91麻豆福利精品推荐| 日韩xxx高潮hd| 亚洲国产另类久久精品| gogo久久| 国内精品久久国产| 伊人精品成人久久综合软件| 99久久99精品| 亚洲私人黄色宅男| 国产精品天天操| 久久精品91久久香蕉加勒比| 国产一区二区三区四区五区3d| 日本欧美精品久久久| 免费精品视频| 国产熟妇搡bbbb搡bbbb| 欧美日韩中文在线| 神马精品久久| 日本午夜在线亚洲.国产| 亚洲专区视频| 五月婷婷深爱五月| 国产日韩欧美精品在线| 波多野结衣绝顶大高潮| 亚洲日本成人网| 最新日韩一区| 亚洲午夜精品久久| 韩国一区二区在线观看| 我家有个日本女人| 欧美videofree性高清杂交| 日本理论片午伦夜理片在线观看| 国产有码一区二区| 永久91嫩草亚洲精品人人| 亚洲色图偷拍视频| 一区二区激情小说| 亚洲aⅴ乱码精品成人区| 热久久这里只有| 欧美亚洲国产精品久久| 国产三级国产精品国产专区50| 中文字幕一区av| www夜片内射视频日韩精品成人| 欧美激情视频网| 欧美国产不卡| 国产视频在线视频| 最新久久zyz资源站| 亚洲免费黄色片| 国产成人精品久久亚洲高清不卡| 第四色成人网| 免费观看一区二区三区| 欧美性xxxxx| 免费不卡视频| 精品乱子伦一区二区三区| 久久在线精品| 日本精品人妻无码77777| 亚洲精品国产精品久久清纯直播| 你懂得影院夜精品a| 中文字幕の友人北条麻妃| 99久久精品国产观看| 欧美成人精品网站| 欧美激情精品久久久久久久变态 | 日韩毛片在线看| 亚洲国产精选| www在线观看免费| 国产精品全国免费观看高清| 女人18毛片水真多18精品| 国产精品91一区| 韩国亚洲精品| 91成人精品一区二区| 精品美女在线播放| 国产精品毛片久久久久久久久久99999999 | 免费看黄色一级视频| 国产成人午夜视频网址 | 看欧美ab黄色大片视频免费| 亚洲天堂2016| 国产免费永久在线观看| av一区二区三区免费| 欧美96一区二区免费视频| 精品在线视频免费| 久久亚洲精品成人|