精品欧美一区二区三区在线观看 _久久久久国色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在线播放| 欧美国产高潮xxxx1819| 亚洲国产欧美一区二区丝袜黑人 | 黄色a级片在线观看| 成人资源在线播放| 欧美日韩在线播放一区| 福利视频免费在线观看| 国产私拍精品| 成人av先锋影音| 国产精品高清在线| 久久久久久久久久久久久久久久久| 色婷婷狠狠五月综合天色拍| 91精品国产综合久久精品性色 | 日本va欧美va欧美va精品| 欧美成人午夜免费视在线看片 | 欧美在线不卡区| 久久99久久99精品免费看小说| 国产精品久久久网站| 精品视频1区2区| 免费黄色福利视频| 免费在线看污片| 18成人在线观看| 美女主播视频一区| 亚洲精品国产精品乱码不卡| 久久成人18免费观看| 国产91对白在线播放| 天天综合天天做| 欧美一区三区| 亚洲欧美在线播放| 国产婷婷在线观看| 亚洲一区二区三区中文字幕在线观看| 欧美亚洲国产bt| 成人免费观看视频在线观看| 精品精品导航| 亚洲资源在线观看| 潘金莲一级淫片aaaaa免费看| 韩国三级av在线免费观看| 成人动漫av在线| 动漫一区二区在线| 精品国产免费无码久久久| 免费成人在线网站| 国产精品福利久久久| 在线视频一区二区三区四区| 亚洲人妖在线| 777国产偷窥盗摄精品视频| 久久久久99精品成人片毛片| 一区二区蜜桃| 两个人的视频www国产精品| 国产小视频你懂的| 欧美独立站高清久久| 中文字幕日韩av电影| 人妻aⅴ无码一区二区三区| 亚洲成人一品| 亚洲人成网站在线播| 熟女俱乐部一区二区视频在线| 猫咪成人在线观看| 日韩精品中文字幕在线观看| 熟女丰满老熟女熟妇| 亚州av日韩av| 亚洲欧美国产日韩中文字幕| 亚洲国产日韩一区无码精品久久久| 日韩三区视频| 亚洲一区二区精品| 大胸美女被爆操| 久久一区91| 久久综合色88| 久久久久国产精品夜夜夜夜夜| 国产一区观看| 97在线免费观看| 日本a级c片免费看三区| 日本成人在线电影网| 国产精品夜间视频香蕉| 国产精品系列视频| 成人免费观看男女羞羞视频| 久久久久久99| 波多野结衣在线影院| 1区2区3区精品视频| 日韩a级黄色片| 国产在线精彩视频| 在线影院国内精品| www.51色.com| 啪啪激情综合网| 中文字幕精品久久久久| 日日噜噜夜夜狠狠久久波多野| 欧美精品九九| 日av在线播放中文不卡| 在线观看日韩一区二区| 国产·精品毛片| 欧美大香线蕉线伊人久久| 香蕉视频在线播放| 亚洲成人av资源| 免费看国产黄色片| 91国内精品| 在线观看久久久久久| 我要看黄色一级片| 免播放器亚洲| 亚洲字幕一区二区| 欧美日韩激情视频一区二区三区| 亚洲欧美综合网| 凹凸国产熟女精品视频| 在线免费成人| 亚洲精品日韩欧美| 久草免费新视频| 日本亚洲三级在线| 国产经品一区二区| 九义人在线观看完整免费版电视剧| 亚洲国产精品久久一线不卡| 我要看一级黄色大片| 国产毛片久久久| 日韩在线视频观看| 国产又大又黄视频| 国产福利精品一区二区| 三级三级久久三级久久18| 国产盗摄在线视频网站| 欧美日韩国产精品成人| 美女又爽又黄视频毛茸茸| 伊人久久大香线| 国产精品福利无圣光在线一区| 国内精品久久久久久久久久| 国产精品素人一区二区| 97超碰青青草| 国产精品chinese在线观看| 日韩一区二区在线视频| 97人妻一区二区精品视频| 成人丝袜高跟foot| 一二三四中文字幕| 日韩黄色三级| 中文字幕v亚洲ⅴv天堂| 天天操天天干天天摸| 99r国产精品| www.射射射| 亚洲一区二区免费在线观看| 久久亚洲影音av资源网| 在线免费观看一级片| 久久久久久一二三区| 国产中文字幕在线免费观看| 亚洲一级大片| 欧美国产日韩二区| 国产aⅴ爽av久久久久成人| 日韩毛片视频在线看| www.色欧美| 欧美大黑bbbbbbbbb在线| 国产精品永久免费观看| a黄色在线观看| 欧美性色黄大片手机版| 蜜桃传媒一区二区亚洲| 日本特黄久久久高潮| 日韩久久在线| 巨胸喷奶水www久久久| 在线观看亚洲区| 中文字幕av久久爽| 国产精品久久久爽爽爽麻豆色哟哟| 成人中文字幕av| 成人午夜av| 国产精品热视频| 日本最新在线视频| 91精品欧美综合在线观看最新| 情侣偷拍对白清晰饥渴难耐| 久久99精品国产麻豆婷婷洗澡| 亚洲在线不卡| 国产精品亚洲欧美日韩一区在线| 不卡毛片在线看| 韩国中文字幕hd久久精品| 亚洲高清在线精品| 亚洲国产精品成人综合久久久| 免费日韩视频| 亚洲国产午夜伦理片大全在线观看网站 | 国产高清一区在线观看| 欧美视频一区二| 日韩va亚洲va欧美va清高| 高清不卡在线观看| 无码aⅴ精品一区二区三区浪潮 | 成人av网在线| aaaaaa亚洲| 亚洲精品二区三区| 极品尤物一区二区三区| 日本欧美日韩| 久久国产精品免费视频| 日韩视频一二三| 国产99在线| 亚洲人成在线观看| 国产精品久久欧美久久一区| 亚洲精品久久久蜜桃| 精品人妻一区二区三区日产| 久久久久国产一区二区| 日本三日本三级少妇三级66| 牛牛影视一区二区三区免费看| 国产成人福利网站| 在线āv视频| 亚洲片国产一区一级在线观看| 中文字幕久久熟女蜜桃| 亚洲综合免费观看高清在线观看| 成人午夜剧场视频网站| 国产在线观看一区二区| 狠狠干 狠狠操| 天天做天天爱天天综合网| 久久免费看av| 精品国产乱码一区二区三区| 国产69久久精品成人| 中文字幕伦理免费在线视频| 亚洲精品一区二三区不卡| 国产又爽又黄又嫩又猛又粗| 精品人伦一区二区三区蜜桃免费| 自拍偷拍第9页| 97国产一区二区| 毛毛毛毛毛毛毛片123| 久久精品动漫| 人人妻人人澡人人爽欧美一区双 | 在线国产精品播放| 天堂网av2014| 91精品国产欧美一区二区18| 欧美黄色一级大片| 亚洲一区二区影院| 男女全黄做爰文章| 国产亚洲美州欧州综合国| 日本中文字幕有码| 狠狠色综合播放一区二区| www.国产区| 1024日韩| 免费在线看黄色片| 女生裸体视频一区二区三区| 农村寡妇一区二区三区| 成人高潮a毛片免费观看网站| 国产日韩在线一区| 日本成人伦理电影| 热久久免费国产视频| 91九色在线看| 欧美高清视频在线播放| www视频在线免费观看| 色妞欧美日韩在线| caoporn国产精品免费视频| 国产婷婷色综合av蜜臀av | 日韩在线你懂得| 国产精品久久久久久久久久尿| 午夜影院一区| 8x拔播拔播x8国产精品| 久草在线视频资源| 欧美激情伊人电影| 国产乱码在线| 国内偷自视频区视频综合| 超碰97免费在线| 久久久久久久av| 另类视频在线| 97精品久久久| 久草在线中文最新视频| 国内精品久久久久久中文字幕| 国产理论电影在线| 97国产一区二区精品久久呦| 国产夫妻在线| 51精品国产黑色丝袜高跟鞋| 一根才成人网| 国产成人综合av| 在线日本欧美| 成人写真福利网| 精品午夜视频| av观看久久| 加勒比久久高清| 久久精品国产99精品国产亚洲性色| 老牛影视av一区二区在线观看| 精品国产综合久久| 九九久久成人| 中文字幕一区二区三区5566| 91精品观看| 国产自产在线视频| 性感少妇一区| 亚洲欧美自偷自拍另类| 国产一区二区调教| 人妻av一区二区| 久久亚洲精品国产精品紫薇| 极品蜜桃臀肥臀-x88av| 亚洲视频狠狠干| 久久精品久久国产| 色88888久久久久久影院野外| 亚洲资源在线播放| 日韩欧美色综合| 欧美成人片在线| 久久久极品av| 2020av在线| 国产精品视频精品| 精品视频在线观看免费观看| 久久亚洲一区二区| 久久社区一区| 无码精品a∨在线观看中文| 日本不卡一二三区黄网| aaa黄色大片| 国产香蕉久久精品综合网| 日本在线一级片| 狠狠躁夜夜躁人人躁婷婷91| 一本到在线视频| 日韩成人在线电影网| 日韩美女网站| 45www国产精品网站| 国产精品亚洲欧美日韩一区在线| 韩日午夜在线资源一区二区 | 日韩在线播放一区| √最新版天堂资源网在线| 国产美女久久久| 色爱综合av| 久久久久久久香蕉| 蜜乳av一区二区三区| 99久久久无码国产精品性波多 | 国产一二精品视频| 精品人伦一区二区三电影| 一区二区三区欧美日韩| 波多野结衣激情视频| 亚洲成人久久久| 黄色网址在线免费观看| 日本人成精品视频在线| 澳门精品久久国产| 亚洲一区二区三区加勒比| 久久不射2019中文字幕| aaa黄色大片| 亚洲品质自拍视频| 亚洲婷婷久久综合| 国产婷婷97碰碰久久人人蜜臀| 中文在线手机av| 成人有码视频在线播放| 国产精品一区2区3区| 日本www在线视频| 国产精品一区二区黑丝| 999福利视频| 欧美日韩视频在线观看一区二区三区 | 2024国产精品| 男人天堂中文字幕| 日韩欧美中文一区| 精产国品自在线www| 国产精品视频成人| 成人激情开心网| 免费激情视频在线观看| 26uuu色噜噜精品一区二区| 久久久久久久蜜桃| 日韩欧美国产麻豆| 在线观看av免费| 999视频在线观看| 在线精品小视频| 一卡二卡三卡四卡五卡| 亚洲三级电影网站| 国产乱码精品一区二区| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 加勒比婷婷色综合久久| 日韩一区二区在线观看视频 | 国产成人午夜视频网址| 亚洲另类春色校园小说| 播放灌醉水嫩大学生国内精品| 不卡视频在线看| 久久久精品免费看| 亚洲精品第一国产综合精品| av最新在线| 精品日韩美女| 久久国产66| 欧美另类z0zx974| 欧美日韩一区二区三区四区五区| 日韩在线观看www| 91视频在线免费观看| 精品69视频一区二区三区Q| 日本一区二区在线观看视频| 亚洲18色成人| 日韩精品视频在线观看一区二区三区| 4388成人网| 日韩国产欧美| 四虎1515hh.com| 五月天视频一区| 精品影院一区| 成人激情视频免费在线| 欧美日韩一区二区国产| 2一3sex性hd| 欧美在线一区二区三区| aaa大片在线观看| 国产一区不卡在线观看| 久久免费黄色| 你懂得在线观看| 亚洲国产成人av在线| 日韩新的三级电影| 伊人久久大香线蕉午夜av| 国产91精品精华液一区二区三区| 国产手机在线视频| 中文综合在线观看| 6080亚洲理论片在线观看| 免费在线观看的av网站| 亚洲欧洲精品一区二区三区不卡| 成人高潮片免费视频| 欧美综合第一页| 91成人看片| 粉嫩av蜜桃av蜜臀av| 欧美日韩精品一区二区| 狂野欧美性猛交xxxxx视频| 日本在线成人一区二区| 国产福利精品一区二区| 波多野结衣视频在线观看| 欧美多人乱p欧美4p久久| 精品国产99| a级一a一级在线观看| 欧美日韩亚洲国产综合| 天天综合av| 少妇久久久久久被弄到高潮| 久久综合久久久久88| 精品人妻无码一区二区色欲产成人 | 国内自拍亚洲| 131美女爱做视频|