c Valgrind記憶體檢測工具 19

2021-09-08 04:28:25 字數 3747 閱讀 6059

valgrind是一套linux下,開放源**(gpl v2)的**除錯工具的集合。valgrind由核心(core)以及基於核心的其他除錯工具組成。核心類似於乙個框架(framework),它模擬了乙個cpu環境,並提供服務給其他工具;而其他工具則類似於外掛程式 (plug-in),利用核心提供的服務完成各種特定的記憶體除錯任務。valgrind的體系結構如下圖所示:

memcheck。這是valgrind應用最廣泛的工具,乙個重量級的記憶體檢查器,能夠發現開發中絕大多數記憶體錯誤使用情況,我們主要使用即此工具,預設選項。此工具檢查下面的程式錯誤:

·        使用未初始化的記憶體 (use of uninitialised memory)

·        使用已經釋放了的記憶體 (reading/writing memory after it has been free』d)

·        使用超過 malloc分配的記憶體空間(reading/writing off the endof malloc』d blocks)

·        申請的空間是否有釋放 (memory leaks – where pointers to malloc』d blocks are lost forever)

·        malloc/free/new/delete申請和釋放記憶體的匹配(mismatched use of malloc/new/new vs free/delete/delete )

callgrind。收集程式執行時的一些資料,函式呼叫關係等資訊,還可以有選擇地進行cache模擬。在執行結束時,它會把分析資料寫入乙個檔案。callgrind_annotate可以把這個檔案的內容轉化成可讀的形式。

cachegrind。它模擬 cpu中的一級快取i1,d1和l2二級快取,能夠精確地指出程式中 cache的丟失和命中。如果需要,它還能夠為我們提供cache丟失次數,記憶體引用次數,以及每行**,每個函式,每個模組,整個程式產生的指令數。這對優化程式有很大的幫助。

helgrind。它主要用來檢查多執行緒程式**現的競爭問題。helgrind尋找記憶體中被多個執行緒訪問,而又沒有一貫加鎖的區域,這些區域往往是執行緒之間失去同步的地方,而且會導致難以發掘的錯誤。helgrind實現了名為」 eraser」 的競爭檢測演算法,並做了進一步改進,減少了報告錯誤的次數。

massif。堆疊分析器,它能測量程式在堆疊中使用了多少記憶體,告訴我們堆塊,堆管理塊和棧的大小。massif能幫助我們減少記憶體的使用,在帶有虛擬記憶體的現代系統中,它還能夠加速我們程式的執行,減少程式停留在交換區中的機率。

extension。可以利用core提供的功能,自己編寫特定的記憶體除錯工具。

要發現linux下的記憶體問題,首先一定要知道在linux下,記憶體是如何被分配的?下圖展示了乙個典型的linux c程式記憶體空間布局: 

乙個典型的linux c程式記憶體空間由如下幾部分組成:

**段(.text)。這裡存放的是cpu要執行的指令。**段是可共享的,相同的**在記憶體中只會有乙個拷貝,同時這個段是唯讀的,防止程式由於錯誤而修改自身的指令。

memcheck 能夠檢測出記憶體問題,關鍵在於其建立了兩個全域性表。

valid-value 表:對於程序的整個位址空間中的每乙個位元組(byte),都有與之對應的 8 個bits;對於 cpu 的每個暫存器,也有乙個與之對應的bit 向量。這些 bits 負責記錄該位元組或者暫存器值是否具有有效的、已初始化的值。

valid-address 表:對於程序整個位址空間中的每乙個位元組(byte),還有與之對應的 1 個bit,負責記錄該位址是否能夠被讀寫。

檢測原理:

ubuntu安裝:

sudo apt-get install valgrind
用法: valgrind[options]prog-and-args [options]:常用選項,適用於所有valgrind工具

1.  -tool=最常用的選項。執行valgrind中名為toolname的工具。預設memcheck。

2.  h –help顯示幫助資訊。

3.  -version顯示valgrind核心的版本,每個工具都有各自的版本。

4.  q –quiet安靜地執行,只列印錯誤資訊。

5.  v –verbose更詳細的資訊,增加錯誤數統計。

6.  -trace-children=no|yes跟蹤子執行緒? [no]

7.  -track-fds=no|yes跟蹤開啟的檔案描述?[no]

8.  -time-stamp=no|yes增加時間戳到log資訊? [no]

9.  -log-fd=輸出log到描述符檔案 [2=stderr]

10. -log-file=將輸出的資訊寫入到filename.pid的檔案裡,pid是執行程式的進行id

11. -log-file-exactly=輸出log資訊到 file

12. -log-file-qualifier=取得環境變數的值來做為輸出資訊的檔名。 [none]

13. -log-socket=ipaddr:port輸出log到socket ,ipaddr:port

log資訊輸出

1.  -xml=yes將資訊以xml格式輸出,只有memcheck可用

2.  -num-callers=show callersin stack traces [12]

3.  -error-limit=no|yes如果太多錯誤,則停止顯示新錯誤? [yes]

4.  -error-exitcode=如果發現錯誤則返回錯誤** [0=disable]

5.  -db-attach=no|yes當出現錯誤,valgrind會自動啟動偵錯程式gdb。[no]

6.  -db-command=啟動偵錯程式的命令列選項[gdb -nw %f %p]

1.  -leak-check=no|summary|full要求對leak給出詳細資訊? [summary]

2.  -leak-resolution=low|med|high how much bt merging in leakcheck [low]

-show-reachable=no|yesshow reachable blocks in leak check? [no]

檢視原始碼

valgrind檢測輸出如下

Valgrind 記憶體檢測工具

valgrind是乙個gpl的軟體,用於linux for x86,amd64 and ppc32 程式的記憶體除錯和 剖析。你可以在它的環境中執行你的程式來監視記憶體的使用情況,比如c 語言中的malloc和free或者 c 中的new和 delete。使用valgrind的工具包,你可以自動的檢...

記憶體檢測工具Valgrind

valgrind是一套linux下,開放源 gpl v2 的 除錯工具的集合。valgrind由核心 core 以及基於核心的其他除錯工具組成。核心類似於乙個框架 framework 它模擬了乙個cpu環境,並提供服務給其他工具 而其他工具則類似於外掛程式 plug in 利用核心提供的服務完成各種...

記憶體洩露檢測工具 valgrind

valgrind 安裝 2.解壓安裝包 tar jxvf valgrind 3.2.3.tar.bz2 3.解壓後生成目錄valgrind 3.2.3 4.cd valgrind 3.2.3 5.執行.autogen.sh設定環境 需要標準的autoconf工具 可選 6.configure 配置v...