一.安裝
專案**:http://valgrind.org/
centos
完整安裝已經包含有
valgrind。
二.使用用
c/c++
開發其中最令人頭疼的乙個問題就是記憶體管理,有時候為了查詢乙個記憶體洩漏或者乙個記憶體訪問越界,需要要花上好幾天時間,如果有一款工具能夠幫助我們做這件事情就好了,
valgrind
正好就是這樣的一款工具。
valgrind
是一款基於模擬
linux
下的程式偵錯程式和剖析器的軟體套件,可以
執行於x86, amd64
和ppc32
架構上。
valgrind
包含乙個核心,它提供乙個虛擬的
cpu執行程式,還有一系列的工具,它們完成除錯,剖析和一些類似的任務。
valgrind
是高度模組化的,所以開發人員或者使用者可以給它新增新的工具而不會損壞己有的結構。
,它是開放原始碼和免費的。
一、介紹
valgrind
包含幾個標準的工具,它們是: 1
、memcheck
memcheck
探測程式中記憶體管理存在的問題。它檢查所有對記憶體的讀
/寫操作,並擷取所有的
malloc/new/free/delete
呼叫。因此
memcheck
工具能夠探測到以下問題: 1
)使用未初始化的記憶體 2
)讀/寫已經被釋放的記憶體 3
)讀/寫記憶體越界 4
)讀/寫不恰當的記憶體棧空間 5
)記憶體洩漏 6
)使用malloc/new/new
和free/delete/delete
不匹配。 2
、cachegrind
cachegrind
是乙個cache
剖析器。它模擬執行
cpu中的
l1, d1
和l2 cache
,因此它能很精確的指出**中的
cache
未命中。如果你需要,它可以列印出
cache
未命中的次數,記憶體引用和發生
cache
未命中的每一行**,每乙個函式,每乙個模組和整個程式的摘要。如果你要求更細緻的資訊,它可以列印出每一行機器碼的未命中次數。在
x86和
amd64
上,cachegrind
通過cpuid
自動探測機器的
cache
配置,所以在多數情況下它不再需要更多的配置資訊了。 3
、helgrind
helgrind
查詢多執行緒程式中的競爭資料。
helgrind
查詢記憶體位址,那些被多於一條執行緒訪問的記憶體位址,但是沒有使用一致的鎖就會被查出。這表示這些位址在多執行緒間訪問的時候沒有進行同步,很可能會引起很難查詢的時序問題。
二、valgrind對你的程式都做了些什麼
valgrind
被設計成非侵入式的,它直接工作於可執行檔案上,因此在檢查前不需要重新編譯、連線和修改你的程式。要檢查乙個程式很簡單,只需要執行下面的命令就可以了
valgrind --tool=tool_name program_name
比如我們要對
ls -l
命令做記憶體檢查,只需要執行下面的命令就可以了
valgrind --tool=memcheck ls -l
不管是使用哪個工具,
valgrind
在開始之前總會先取得對你的程式的控制權,從可執行關聯庫里讀取除錯資訊。然後在
valgrind
核心提供的虛擬
cpu上執行程式,
valgrind
會根據選擇的工具來處理**,該工具會向**中加入檢測**,並把這些**作為最終**返回給
valgrind
核心,最後
valgrind
核心執行這些**。
如果要檢查記憶體洩漏,只需要增加
--leak-check=yes
就可以了,命令如下
valgrind --tool=memcheck --leak-check=yes ls -l
不同工具間加入的**變化非常的大。在每個作用域的末尾,
memcheck
加入**檢查每一片記憶體的訪問和進行值計算,**大小至少增加
12倍,執行速度要比平時慢25到
50倍。
valgrind
模擬程式中的每一條指令執行,因此,檢查工具和剖析工具不僅僅是對你的應用程式,還有對共享庫,
gnu c庫,x
的客戶端庫都起作用。
Linux開發工具
linux開發工具 vim gcc gdb make git github 文字編輯器 vim 功能最強大 1 使用 三種模式 命令列模式 插入模式 底行模式 vim 空格 檔名 例如vim hello.c 此時是命令列模式 無法插入資料 需要進入插入模式 按i或者a 退出插入模式 按esc 切換到...
《Linux程式設計》 開發工具
一 多個原始檔帶來的問題 二 make命令和makefile 1 makefile的語法 1 makefile檔案由一組依賴關係和規則組成。2 make命令會會根據makefile檔案來確定目標檔案的建立順序以及正確的規則呼叫順序。2 make命令的選項和引數 1 make程式選項 i k 讓mak...
Linux開發工具 gcc
鏈結程式把所有物件檔案中的機器碼組合在一起,並解析它們之間的交叉引用。它還整合了物件模組所使用的庫函式的 這是鏈結程式的一種簡化表示,因為這裡假定在可執行模組中,模組之間的所有鏈結都是靜態建立的。實際上有些鏈結是動態的,即這些鏈結是在程式執行時建立的。鏈結就是鏈結器ld將各個目標檔案組裝在一起,解決...