<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    Linux內存調試工具初探-MEMWATCH

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    C 語言作為 Linux 系統上標準的編程語言給予了我們對動態內存分配很大的控制權。這種自由可能會導致嚴重的內存管理問題,可能導致程序崩潰或隨時間的推移導致性能降級。

    內存泄漏(即 malloc() 內存在對應的 free() 調用執行后永不被釋放)和緩沖區溢出(例如對以前分配到某數組的內存進行寫操作)是一些常見的問題,它們可能很難檢測到。這一部分將討論幾個調試工具,它們極大地簡化了檢測和找出內存問題的過程

    1. Memwatch簡介
    Memwatch是C語言的內存檢測器。除了檢測內存的功能外,它同樣可以做其它的一些事情,而我們主要還是在于講述它的基本功能。如果你真的想要知道所有相關的具體細節,可詳細查看頭文件memwatch.h以及源代碼。

    它使用C于處理器的功能,Memwatch使用它自己定義的功能函數取代所有在你的程序中用ANSI C定義的內存分配函數,Memwatch的內存分配函數包含了了所有的分配記錄信息。

    Memwatch可以在交叉編譯后的目標板上運行。

    2. Memwatch功能
    (1) 主要有基本的內存管理函數
          -mwMalloc()
          -mwFree()
          -mwCalloc()
          -mwRealloc()
    (2) MemWatch能夠檢測的功能包括
          -雙重釋放(double-free)、
          -錯誤釋放(erroneous free)、
         -內存泄漏(unfreed memory)、
         -溢出(Overflow)、
         -下溢(Underflow)

    3. 編譯
        當編譯時, 相讓memwatch起作用, 編譯是加上-DMEMWATCH


    4. memwatch.log內容
        在正常操作的情況下,memwatch會創建一個名叫memwatch.log的文件。但有的時候,memwatch.log文件并不能被創建。此時,memwatch會嘗試創建命名類似memwatNN.log的文件,其中NN是01到99之間的數字。如果還是失敗,則沒有log文件。

    5. 應用實例

    清單 1. 內存樣本(test1.c)

     

    #include <stdlib.h>
    #include <stdio.h>
    #include "memwatch.h"
    int main(void)
    {
    char *ptr1;
    char *ptr2;
    ptr1 = malloc(512);
    ptr2 = malloc(512);
    ptr2 = ptr1;
    free(ptr2);
    free(ptr1);
    }

     

     

    清單 1 中的代碼將分配兩個 512 字節的內存塊,然后指向第一個內存塊的指針被設定為指向第二個內存塊。結果,第二個內存塊的地址丟失,從而產生了內存泄漏。

    現在我們編譯清單 1 的 memwatch.c。下面是一個 makefile 示例:

    test1

     

    gcc -DMEMWATCH -DMW_STDIO test1.c memwatch
    c -o test1

     

     

    當您運行 test1 程序后,它會生成一個關于泄漏的內存的報告。清單 2 展示了示例 memwatch.log 輸出文件。

    清單 2. test1 memwatch.log 文件

     

      MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh
    ...
    double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14)
    ...
    unfreed: <2> test1.c(11), 512 bytes at 0x80519e4
    {FE FE FE FE FE FE FE FE FE FE FE FE ..............}
    Memory usage statistics (global):
    N)umber of allocations made: 2
    L)argest memory usage : 1024
    T)otal of all alloc() calls: 1024
    U)nfreed bytes totals : 512

     

     

    MEMWATCH 為您顯示真正導致問題的行。如果您釋放一個已經釋放過的指針,它會告訴您。對于沒有釋放的內存也一樣。日志結尾部分顯示統計信息,包括泄漏了多少內存,使用了多少內存,以及總共分配了多少內存。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全