Valgrind是一個Linux程序的調試和性能剖析工具。利用Valgrind工具集能夠很容易地自動檢查到html
內存管理和線程的bugs。程序員
1)、Valgrind能夠自動檢查到內存管理和線程的bugs,節約程序員的調試時間。數據庫
2)、Valgrind能夠從底層分析到程序的瓶頸,以幫助程序員提升程序的運行速度。編程
3)、Valgrind遵循GNU GPL(通用公共許可證),是免費開源的軟件。緩存
4)、Valgrind能夠運行在大多數流行的平臺上,如x86/Linux, AMD64/Linux和PPC32/Linux.包括服務器
全部的Linux發行版,如:Red Hat, SuSE, Debian, Gentoo, Slackware, Mandrake等。 網絡
5)、Valgrind使用很簡單。它利用動態二進制手段,因此咱們不用改變、編譯和從新連接程多線程
序。只須要在命令行上把工具名放在程序前面。框架
6)、Valgrind不是個玩具。能夠被應用於各類規模的項目,能夠分析超過2500萬行代碼的程編程語言
序。
7)、Valgrind使用於各類類型的軟件。如:桌面應用程序,庫,數據庫,遊戲,網頁瀏覽
器,網絡服務器,分佈式控制系統,虛擬現實的框架,交易服務器,編譯器,解釋器,虛擬機,
電信應用,嵌入式軟件,醫療成像,科學方案,信號處理程序,視頻/音頻節目,商業智能軟件,
金融/銀行軟件,操做系統守護進程等等。具體參考:http://valgrind.org/gallery/users.html
8)、Valgrind被應用地很普遍。
9)、Valgrind適用於任何語言。由於它直接應用於程序的二進制程序。但主要用於C/C++程
序,由於用這兩種語言寫的程序會產生最多的bugs!它也能夠分析混合語言寫的程序,包括C,
C++, Java, Perl, Python, assembly code, Fortran, Ada等等。
10)、Valgrind會覆蓋咱們100%的用戶程序,甚至包括系統庫。你甚至可使用Valgrind分
析那些沒有源代碼的程序。
11)、Valgrind是可擴展的。任何人寫的有用工具均可以加入其中。
12)、Valgrind是被積極維護的。
這取決於你確切的需求。下面是例子:
一、Memcheck
Memcheck檢查內存管理問題,主要是針對C/C++程序。當程序運行在MeMcheck
的監視下時,全部的讀取和寫入內存都會被檢查,調用malloc/new/free/delete都會被截
獲。最後,Memcheck會檢查到你的程序:
Memcheck會把在這些錯誤出現時儘快報道這些錯誤,給出這些錯誤出現的源代
碼行號,以及一個跟錯誤行相鄰的函數的堆棧跟蹤。Memcheck在字節級別跟蹤尋
址,在位級別跟蹤變量的初始化。最終,它能夠檢測到單個未初始化的位,而且不會報道位域虛
假的操做。Memcheck會使程序運行變慢10--30x倍。
二、Cachegrind
Cachegrind是一個緩存分析器。它詳細地演示模擬L一、D1和D2在CPU中的運行狀況,所以
能夠準確地定位高速緩存未命中的源代碼。它指出每一個函數、每一個模塊高速緩存未命中的次數,
內存引用和每行源程序所執行的指令,以及整個程序的總結。Cachegrind對任何編程語言都很是
有用。它會使程序運行慢20--100x倍。
三、Callgrind
做者是Josef Weidendorfer,是Cachegrind的延伸擴展。提供Cachegrind所能提供的全部信
息,額外加上了調用關係圖。它被整合到Valgrind3.2.0主要版本里。它有一個單獨的了不得的可
視化工具,KCachegrind,這個可視化工具提供Callgrind收集的數據的更改概述;一樣能夠應用於
Cachegrind的輸出可視化。
四、Massif
Massif是一個堆棧分析器。它經過對程序的堆棧進行按期循環的快照來進行詳細的堆棧分
析。它產生出程序堆棧一段時間內的使用狀況圖,包括程序中那些對大部份內存分配負責的部分
的信息。這個圖表被包含分配最多內存的地方的信息的文本文件或者HTML文件補充。Massif會
使程序運行慢20x倍。
Helgrind是一個線程調試器,它發現多線程程序中的數據競爭。它尋找那些會被超過一個
(POSIX p-)線程的內存位置,但對於那些沒有一直使用的(pthread_mutex_)鎖會被找到。
這些地方被指示爲會在線程間丟失同步,並會產生難以找到的依賴於時間的錯誤。Helgrind適用
於任何使用多線程的程序。它如今仍是個實現性工具,歡迎用戶反饋。
六、DRD
DRD適用於檢測多線程在C/C++程序中錯誤的工具。這個工具適用於任何使用POSIX線程原
語的程序或者創建在POSIX線程原語上的各類概念。DRD能夠檢測並鎖定違反秩序的行爲,並且
多於大多數程序,DRD只須要少許的內存來進行分析。
七、Lackey, Nulgrind
用於測試和演示目的的工具。
3、Valgrind工具應用簡介
#include <stdlib.h> void f( void ) { int *x = malloc( 10 * sizeof( int ) ); x[ 10 ] = 0; // problem 1: heap block overrun // problem 2: memory leak -- x not freed } int main() { f(); return 0; }
下面是這些信息的含義:
應該按照報道的順序修改錯誤,由於後面的錯誤多是前一個致使的。不遵循這個規則是導
致Memcheck使用困難的一個一般緣由。
堆棧跟蹤記錄告訴咱們泄漏內存的分配位置。 不幸的是,Memcheck不能告訴你爲何內存
泄漏了。
這裏有幾種類型的泄漏,下面是最重要的兩種:
Memcheck也報道使用未初始化的值,一般的信息是「Conditional jump or move depends on
uninitialised value(s)」。這一般很難找到問題的根源,可使用--track-origins=yes得到更多信
息。
http://blog.csdn.net/sunmenggmail/article/details/10543483