qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          如何檢測(cè)內(nèi)存泄漏

           內(nèi)存泄漏的問題,在百度是遇到最多的,阿里相對(duì)少點(diǎn)。與內(nèi)存泄漏斗爭(zhēng)了很久,我總結(jié)下常用的一些有效測(cè)試方法吧。
            1、valgrind,這是非常好用的工具,雖然參數(shù)很多,輸出結(jié)果較多,但是只要認(rèn)真看下,就很容易發(fā)現(xiàn)問題,報(bào)告是很詳細(xì)的,不要被嚇倒。valgrind檢測(cè)的內(nèi)存泄漏是非常準(zhǔn)的,可以精確定位到代碼行甚至是變量。valgrind基于valginrd core框架,這是個(gè)非常有強(qiáng)大的框架,他的作用不僅僅在于檢測(cè)內(nèi)存泄漏的,強(qiáng)烈建議測(cè)試新手通讀下全部的文檔。valgind自己也會(huì)有誤報(bào)和漏報(bào),所有具體場(chǎng)景需要具體分析。報(bào)告中一旦出現(xiàn)definitely lost的標(biāo)記,就表示一定會(huì)有內(nèi)存泄漏,泄漏的字節(jié)數(shù)也會(huì)報(bào)告出來,可以根據(jù)泄漏的內(nèi)存大小和請(qǐng)求次數(shù)計(jì)算出到底是那個(gè)變量沒有釋放。
            2、利用pmap+gdb,pmap可以列出特定進(jìn)程的所有內(nèi)存分配的地址和大小,通過gdb就可以直接看這些地址屬于什么變量,通過統(tǒng)計(jì)這些內(nèi)存地址的大小,就可以很容易的發(fā)現(xiàn)問題。利用自動(dòng)化的gdb調(diào)試工具也可以很方便的定位。
            3、其他的還包括memprof、商業(yè)工具Purify IBM出品,官方宣傳說的不錯(cuò),但是這種不開放的技術(shù),在業(yè)界得不到認(rèn)可,國內(nèi)大公司一般那都不用,只有人傻錢多的公司在用。
            4、利用一些trace工具,比如ptrace,strace之類的工具,這些trace工具會(huì)追蹤特定的api,只需要統(tǒng)計(jì)malloc和free的調(diào)用次數(shù)就可以簡(jiǎn)單的發(fā)現(xiàn)是否有泄漏,但是無法定位代碼行。另外還有一個(gè)更高深的工具,SystemTap,這個(gè)在國內(nèi)應(yīng)用還不多,但是非常厲害,可以方便hook程序的關(guān)鍵邏輯并插入探針。從而可以方便的檢測(cè)內(nèi)存泄漏。Systemtap目前還不通用,而且安裝復(fù)雜,暫時(shí)不推薦使用,可以關(guān)注下,過幾年可能會(huì)大規(guī)模應(yīng)用。
            valgrind是首選,因?yàn)樗脑O(shè)計(jì)就是為了解決所有的c++的內(nèi)存問題。一些valgrind不能簡(jiǎn)單發(fā)現(xiàn)的,我一般會(huì)review代碼,然后通過gdb自動(dòng)調(diào)試技術(shù)來發(fā)現(xiàn)問題。通過valgrind+gdb,可以解決所有的內(nèi)存泄漏。
            另外,內(nèi)存的泄漏也并不完全是沒有及時(shí)的free,還有可能是其他的原因,比如設(shè)計(jì)問題等。需要靠一定的開發(fā)經(jīng)驗(yàn)判斷。
            要盡量把靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試盡早的加入到持續(xù)集成中,以盡早的發(fā)現(xiàn)問題,不然一旦代碼復(fù)雜,追查的成本就會(huì)增大。

          posted on 2014-09-11 10:41 順其自然EVO 閱讀(356) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 新密市| 乌拉特中旗| 永嘉县| 四子王旗| 东乌珠穆沁旗| 思南县| 兴隆县| 唐山市| 简阳市| 怀仁县| 乐昌市| 万荣县| 屏南县| 徐闻县| 嵩明县| 江安县| 娄底市| 遵义县| 辰溪县| 鹿泉市| 广宗县| 峨山| 贵德县| 英德市| 永州市| 庄浪县| 工布江达县| 岳普湖县| 盐源县| 夏津县| 广饶县| 历史| 吉木萨尔县| 伊宁县| 长垣县| 滦南县| 鄂伦春自治旗| 宁武县| 桐庐县| 荔波县| 静宁县|