目錄
- 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:
- Still reachable (cover case 1,2) (指針釋放後仍有機會使用或者釋放)
- Definitely(明确地) lost (cover case 3)(确定的記憶體洩露)
- Indirectly lost (cover case 4,9)(指向該記憶體的指針都位于記憶體洩露處)
- 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 方式。