一談到內存泄露, 多數程序猿都聞之色變。 沒錯, 內存泄露很是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有關的基本調試工具和方法。