乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      內(nèi)存泄漏定位工具--mtrace

       西北望msm66g9f 2020-09-13

      我們前面寫了一篇關(guān)于利用malloc的鉤子回調(diào)定位程序內(nèi)存泄漏位置的文章。實際上glibc也利用了malloc這一機制,給我們提供了現(xiàn)成的內(nèi)存泄漏定位工具mtrace。

      mtrace 用于開啟內(nèi)存使用記錄,muntrace用于取消內(nèi)存使用記錄。內(nèi)存使用情況會記錄到一個文件,文件名由環(huán)境變量:MALLOC_TRACE指定。

      • 1. 代碼中添加mtrace(), muntrace() 函數(shù)

      #include <mcheck.h>
      int main(int argc, char* argv[])
      {
      #ifdef  MEMORY_CHECK
          mtrace();
      #endif 

      ... // other codes

      #ifdef  MEMORY_CHECK
          muntrace();
      #endif 
      }
      • 2. 編譯代碼
        gcc -g  xxx.c  -o xxx
        必須使用 -g 選項,否則無法定位到泄漏的位置。

      • 3. 設(shè)置內(nèi)存跟蹤的保存路徑,并運行代碼

      export MALLOC_TRACE=xxx.log
      ./xxx
      • 4. 分析程序運行時保留的結(jié)果

      mtrace xxx  xxx.log

      此處調(diào)用的mtrace是glibc提供的一個用于解析mtrace函數(shù)執(zhí)行結(jié)果的perl腳本,位于/usr/bin下面,你可以用vi打開。

      實例如下:
      test_mcheck.c

      #include <mcheck.h>
      #include <malloc.h>
      int main(int argc, char* argv[])
      {
          void * ptr;
          mtrace();
          ptr = malloc(100);//故意不釋放
          muntrace();
          return 0;
      }

      運行結(jié)果:


      這是編譯程序不加-g選項的情況,可以看到caller一列的信息為??:?。caller這一列表示未釋放的malloc位置的文件名和行號。

      加了-g選項的結(jié)果:

      原理很簡單,mtrace函數(shù)會注冊malloc和free的鉤子(見前面文章),在鉤子里打印信息到我們設(shè)置的文件。再利用mtrace腳本工具對統(tǒng)計信息進行解析,沒有成對出現(xiàn)的malloc/free即被認為是內(nèi)存泄漏,同時利用-g后a.out里的調(diào)試信息,輸出泄漏的所在文件名和行號。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多