內存檢查工具Valgrind介紹,安裝及使用


Valgrind是運行在Linux上一套基於仿真技術的程序調試和分析工具,它包含一個內核──一個軟件合成的CPU,和一系列的小工具,每個工具都可以完成一項任務──調試,分析,或測試等。Valgrind可以檢測內存泄漏和內存違例,還可以分析cache的使用等,靈活輕巧而又強大,能直穿程序錯誤的心臟,真可謂是程序員的瑞士軍刀。
一. Valgrind概述
1.Memcheck
最常用的工具,用來檢測程序中出現的內存問題,所有對內存的讀寫都會被檢測到,一切對malloc()/free()/new/delete的調用都會被捕獲。所以,它能檢測以下問題:
1.對未初始化內存的使用;
2.讀/寫釋放后的內存塊;
3.讀/寫超出malloc分配的內存塊;
4.讀/寫不適當的棧中內存塊;
5.內存泄漏,指向一塊內存的指針永遠丟失;
6.不正確的malloc/free或new/delete匹配;
7,memcpy()相關函數中的dst和src指針重疊。
這些問題往往是C/C++程序員最頭疼的問題,Memcheck在這里幫上了大忙。
2.Callgrind
和gprof類似的分析工具,但它對程序的運行觀察更是入微,能給我們提供更多的信息。和gprof不同,它不需要在編譯源代碼時附加特殊選項,但加上調試選項是推薦的。Callgrind收集程序運行時的一些數據,建立函數調用關系圖,還可以有選擇地進行cache模擬。在運行結束時,它會把分析數據寫入一個文件。callgrind_annotate可以把這個文件的內容轉化成可讀的形式。
3.Cachegrind
Cache分析器,它模擬CPU中的一級緩存I1,Dl和二級緩存,能夠精確地指出程序中cache的丟失和命中。如果需要,它還能夠為我們提供cache丟失次數,內存引用次數,以及每行代碼,每個函數,每個模塊,整個程序產生的指令數。這對優化程序有很大的幫助。
4.Helgrind
它主要用來檢查多線程程序中出現的競爭問題。Helgrind尋找內存中被多個線程訪問,而又沒有一貫加鎖的區域,這些區域往往是線程之間失去同步的地方,而且會導致難以發掘的錯誤。Helgrind實現了名為“Eraser”的競爭檢測算法,並做了進一步改進,減少了報告錯誤的次數。不過,Helgrind仍然處於實驗階段。
5. Massif
堆棧分析器,它能測量程序在堆棧中使用了多少內存,告訴我們堆塊,堆管理塊和棧的大小。Massif能幫助我們減少內存的使用,在帶有虛擬內存的現代系統中,它還能夠加速我們程序的運行,減少程序停留在交換區中的幾率。
此外,lackey和nulgrind也會提供。Lackey是小型工具,很少用到;Nulgrind只是為開發者展示如何創建一個工具。我們就不做介紹了。


二、安裝
(1)wget http://www.valgrind.org/downloads/valgrind-3.11.0.tar.bz2 下載安裝包
  valgrind在版本上很傲嬌,最好下載最新的版本,否則會出現很多莫名其妙的問題。
(2)bzip2 -d valgrind-3.11.0.tar.bz2
(3)tar xvf valgrind-3.11.0.tar
(4)使用超級用戶執行以下命令:
  sudo ./configure
  sudo make
  sudo make install
(5)配置環境變量
  切換到cd /etc/profile.d目錄下,使用超級用戶創建文件valgrind.sh
  里面添加如下內容
  #!/bin/sh
  VALGRIND_ROOT=/home/Lyndon/valgrind-3.11.0
  VALGRIND_INCLUDE=/usr/local/include/valgrind
  VALGRIND_LIB=/usr/local/lib/valgrind
  export VALGRIND_ROOT VALGRIND_INCLUDE VALGRIND_LIB


修改valgrind.sh的權限 sudo chmod +x valgrind.sh,執行./valgrind.sh


三、代碼測試

#include <iostream>
using namespace std;
int main() {
    double* m_arr = new double[5 * sizeof(double)];
    // m_arr[6] = 1.233;  // 數組下標越界,此處如果是g++是檢查不出來的,gcc可以檢查出問題,
// 具體原因請自行網上搜索資料http://bbs.chinaunix.net/thread-4095180-1-1.html該鏈接有說明 // delete []m_arr; // 內存沒有釋放 m_arr = NULL; return 0; }

編譯

g++ -g valgrind.cpp

使用工具檢查

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out

LEAK SUMMARY:
definitely lost: 320 bytes in 1 blocks

因程序退出而泄露了320個字節

 

修復bug,重新檢查

通過。

注:

Valgrind 中包含的 Memcheck 工具可以檢查以下的程序錯誤:
  使用未初始化的內存 (Use of uninitialised memory)
  使用已經釋放了的內存 (Reading/writing memory after it has been free’d)
  使用超過malloc分配的內存空間(Reading/writing off the end of malloc’d blocks)
  對堆棧的非法訪問 (Reading/writing inappropriate areas on the stack)
  申請的空間是否有釋放 (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 [])
  src和dst的重疊(Overlapping src and dst pointers in memcpy() and related functions)
  重復free

 

參考鏈接:

http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html

http://blog.csdn.net/21aspnet/article/details/8172124

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM