Valgrind學習

1、Valgrind簡介

一、關於Valgrind

     Valgrind是一個Linux程序的調試和性能剖析工具。利用Valgrind工具集能夠很容易地自動檢查到html

內存管理和線程的bugs。程序員

二、爲何使用Valgrind

     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是被積極維護的。

三、何時使用Valgrind

        這取決於你確切的需求。下面是例子:

  • 對於小型程序應該任什麼時候候都使用(大多數是Memcheck),這能夠幫助你快速地找到內存bugs。
  • 在自動單元,集成,系統,或迴歸測試等應用中自動使用Valgrind工具,沒有代碼不會被測試到。
  • 在大型修改以後,應該使用Valgrind來檢查是否有新的bug被引入。
  • 在bug出現時,使用Valgrind尋找緣由。
  • 當程序運行得很奇怪,有bug的嫌疑時,用Valgrind尋找問題所在。
  • 在發行應用之前,使用Valgrind檢查程序以使程序更穩定。
  • 利用Valgrind的性能剖析工具,分析程序運行所花大量時間的地方,來提升速度。

2、Valgrind工具集

   

     一、Memcheck

       Memcheck檢查內存管理問題,主要是針對C/C++程序。當程序運行在MeMcheck

的監視下時,全部的讀取和寫入內存都會被檢查,調用malloc/new/free/delete都會被截

獲。最後,Memcheck會檢查到你的程序:

  •   訪問沒有它權限的內存位置(沒有分配的區域,被釋放的區域,超過堆尾部的區域,堆棧中不能訪問的區域)。
  •   用危險的方式使用沒有初始化的值。
  •   內存泄漏。
  •   作糟糕的內存釋放(兩次釋放,不匹配釋放)。
  •   把重複的地址和源內存塊送給memcpy()和相關函數。

       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

       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;
}

        下面是這些信息的含義:

  •  3865是進程的ID,一般不重要。
  •  第一行(「Invalid write...」)告訴咱們錯誤的類型。這裏的問題是程序寫一個它沒擁有的內存,致使堆塊溢出。
  •  在第一行下面是一個堆棧跟蹤記錄,告訴咱們問題出在哪。堆棧跟蹤記錄能夠變得很是大,很是容易困惑,特別是使用C++ STL時。自下而上的查看會有幫助。若是堆棧跟蹤記錄不夠大,可使用--num-callers選項讓它變得更大。
  • 代碼地址(eg.0x8048438)一般不重要,但偶爾用來跟蹤重要的怪異bugs。
  • 有些信息有第二成分用來描述有關的內存地址。這裏顯示的程序寫入的內存位置超過了在example.c第5行調用malloc分配的內存的末尾。

       應該按照報道的順序修改錯誤,由於後面的錯誤多是前一個致使的。不遵循這個規則是導

致Memcheck使用困難的一個一般緣由。 

   

     堆棧跟蹤記錄告訴咱們泄漏內存的分配位置。 不幸的是,Memcheck不能告訴你爲何內存

泄漏了。

     這裏有幾種類型的泄漏,下面是最重要的兩種:

  • 「definitebly lost」:肯定的內存泄漏。
  • 「probably lost」:發現了一個指向某塊內存中部的指針,而不是指向內存塊頭部。這種指針通常是原先指向內存塊頭部,後來移動到了內存塊的中部,還有可能該指針和該內存根本就沒有關係,檢測工具只是懷疑有內存泄漏。

     Memcheck也報道使用未初始化的值,一般的信息是「Conditional jump or move depends on

uninitialised value(s)」。這一般很難找到問題的根源,可使用--track-origins=yes得到更多信

息。

 

具體使用能夠參考:

http://blog.csdn.net/sunmenggmail/article/details/10543483

相關文章
相關標籤/搜索