天天看點

valgrind 記憶體檢查工具valgrind

目錄

  • valgrind
    • 1. 編譯安裝
    • 2. valgrind包含的工具
    • 3.官方文檔
    • 4. Valgrind(memcheck)報錯分類解析
    • 5.指令及參數
      • 指令
      • 參數

valgrind

1. 編譯安裝

wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2

tar -jxvf valgrind-3.15.0.tar.bz2

cd valgrind-3.15.0

./configure

make

sudo make install

2. valgrind包含的工具

  • Memcheck。這是 valgrind 應用最廣泛的工具,一個重量級的記憶體檢查器,能夠發現開發中絕大多數記憶體錯誤使用情況,比如:使用未初始化的記憶體,使用已經釋放了的記憶體,記憶體通路越界等。這也是本文将重點介紹的部分。
  • Callgrind。它主要用來檢查程式中函數調用過程中出現的問題。
  • Cachegrind。它主要用來檢查程式中緩存使用出現的問題。
  • Helgrind。它主要用來檢查多線程程式中出現的競争問題。
  • Massif。它主要用來檢查程式中堆棧使用中出現的問題
  • Extension。可以利用 core 提供的功能,自己編寫特定的記憶體調試工具。

3.官方文檔

官方參考文檔:http://valgrind.org/docs/manual/QuickStart.html

4. Valgrind(memcheck)報錯分類解析

Valgrind(memcheck)包含這 7 類錯誤(高亮部分)

  • illegal read/illegal write errors(非法讀錯誤/非法寫錯誤)

    eg: Invalid read of size 4

  • use of uninitialised values(使用未初始化的值)

    eg:Conditional jump or move depends on uninitialised value(s)

  • use of uninitialised or unaddressable values in system calls(

    在系統調用中使用未初始化或無法尋址的值)

    eg: Syscall param write(buf) points to uninitialised byte(s)

  • illegal frees(非法釋放)

    eg: Invalid free()

  • when a heap block is freed with an inappropriate deallocation function(使用不适當的釋放函數釋放堆塊)

    eg: Mismatched free() / delete / delete []

  • overlapping source and destination blocks(重疊的源和目标塊)

    eg: Source and destination overlap in memcpy(0xbffff294, 0xbffff280, 21)

  • memory leak detection(檢測到記憶體洩漏)

    eg:

    1. Still reachable (cover case 1,2) (指針釋放後仍有機會使用或者釋放)
    2. Definitely(明确地) lost (cover case 3)(确定的記憶體洩露)
    3. Indirectly lost (cover case 4,9)(指向該記憶體的指針都位于記憶體洩露處)
    4. Possibly lost (cover case 5,6,7,8)(可能的記憶體洩露,仍然存在某個指針能夠通路某快記憶體,但該指針指向的已經不是該記憶體首位置)

5.指令及參數

指令

參數

--toll=tool name     #制定使用的工具,預設是memcheck
--log-file=path+filename  #制定報告輸出檔案
--track-origins=yes #是否顯示未定義的變量,在堆、棧中被定義沒有被 initialised 的變量都被定義成origins。預設是關閉這個 option 的。
-- show-leak-kinds=all #這裡可以支援的選項有[definite|possible],一般隻需要去關注 definite(明确的),possible 是可能會存在。
--leak-check=full #當伺服器退出時是否收集輸出記憶體洩漏,選項有[no|summary|full]這個地方我們将其設定成全輸出,預設将會使用 summary 方式。

           

繼續閱讀