利用linux的mtrace命令定位內存泄露(Memory Leak)

        一談到內存泄露, 多數程序猿都聞之色變。 沒錯, 內存泄露很是easy引入。 但很是難定位。  以你個人手機爲例(若是不經常關機)。 若是天天泄露一些內存, 那麼開始的一個星期, 你會發現手機好好的。 當內存泄露積累到必定程度,  那就是各類卡死了。 系統異常, 最後死機。 不得不從新啓動。linux

        假設搞開發。 遇到內存泄露問題, 那就呵呵了。 你可能先得花好幾天來複現問題(泄露積累), 而後需要花好幾天來定位問題和改動問題, 而後又要花好幾天來驗證問題, 而且。 很是有可能無法一次改好, 上述流程又要循環了。函數

確實挺苦逼的。工具

        我我的以爲, 在內存泄露問題上。 主動預防比被動定位要划算得多。 但無論你怎麼預防, 總有掉鏈子的時候, 因此, 有時候不得不去被動定位內存泄露。post


        在本文中。 暫不談論手機內存泄露問題的定位, 只介紹一個實用的linux小命令:mtrace(memory trace), 它可以用來協助定位內存泄露。 搞開發的, 應該或多或少地據說過mtrace.spa

        如下, 咱們來看看程序:調試

#include <stdio.h>

int main()
{
        setenv("MALLOC_TRACE", "taoge.log", "1");
        mtrace();

        int *p = (int *)malloc(2 * sizeof(int));

        return 0;
}
       有的朋友要說了, 一眼就能看出內存泄露啊。 但是。 當程序大了以後, 怎能只依靠肉眼? 好, mtrace該出場了。


        編譯:gcc -g -DDEBUG test.c   (千萬要注意, -g不可漏掉。 不然, 儘管最後能定位到內存泄露, 但卻找不到在代碼的第幾行。由於我代碼中沒有Debug宏控制, 因此編譯時, -DDEBUG是可以省略的。 所以, 直接寫成gcc -g test.c就能夠)code

        執行:./a.outblog

        定位:mtrace a.out taoge.logip

        結果:內存


       可以看到, 有內存泄露,且正肯定位到了代碼的行數。


       咱們想一下mtrace函數/命令的原理, 事實上也很是easy, 無非就是記錄每一對malloc/free的調用狀況, 從這個意義上來說, mtrace替代了部分咱們的眼睛, 牢牢地盯着malloc/free, 因此能看到泄露仍是不泄露啊。



       說明一下。 個人linux上並無安裝mtrace命令, 因此沒法調試, 在網友Jukay的幫助下, 我才接觸到shiyanlou這個優秀的在線工具, 地址是:https://www.shiyanlou.com/ , 你們不需要註冊。 直接用QQ登陸就能夠。 上面的過程就是在shiyanlou中作的。 沒有linux環境的朋友們。 之後就可以在這上面玩了, 不要再扯理由說沒有linux環境啦。 再次感謝Jukay介紹這麼優秀的在線工具。


       OK,  本文先寫到這裏, 興許會繼續介紹一些與linux有關的基本調試工具和方法。

相關文章
相關標籤/搜索