歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下Valgrind的使用方法

Linux下Valgrind的使用方法

日期:2017/2/28 14:27:03   编辑:Linux教程

Valgrind是運行在Linux上一套基於仿真技術的程序調試和分析工具,它包含一個內核──一個軟件合成的CPU,和一系列的小工具,每個工具都可以完成一項任務──調試,分析,或測試等。Valgrind可以檢測內存洩漏和內存違例,還可以分析cache的使用等,靈活輕巧而又強大,能直穿程序錯誤的心髒,真可謂是程序員的瑞士軍刀。

一、Valgrind的主要功能

Valgrind工具包包含多個工具,如Memcheck,Cachegrind,Helgrind,Callgrind,Massif。下面分別介紹個工具的作用:

Memcheck 工具主要檢查下面的程序錯誤:

  1.使用未初始化的內存 (Use of uninitialised memory)
  2.使用已經釋放了的內存 (Reading/writingmemory after it has been free’d)
  3.使用超過 malloc分配的內存空間(Reading/writing off the end of malloc’d blocks)
  4.對堆棧的非法訪問 (Reading/writinginappropriate areas on the stack)
  5.申請的空間是否有釋放 (Memory leaks –where pointers to malloc’d blocks are lost forever)
  6.malloc/free/new/delete申請和釋放內存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
  7.src和dst的重疊(Overlapping src and dst pointers in memcpy() and related functions)
Callgrind
  Callgrind收集程序運行時的一些數據,函數調用關系等信息,還可以有選擇地進行cache模擬。在運行結束時,它會把分析數據寫入一個文件。callgrind_annotate可以把這個文件的內容轉化成可讀的形式。

Cachegrind
它模擬 CPU中的一級緩存I1,D1和L2二級緩存,能夠精確地指出程序中 cache的丟失和命中。如果需要,它還能夠為我們提供cache丟失次數,內存引用次數,以及每行代碼,每個函數,每個模塊,整個程序產生的指令數。這對優化程序有很大的幫助。

Helgrind
  它主要用來檢查多線程程序中出現的競爭問題。Helgrind 尋找內存中被多個線程訪問,而又沒有一貫加鎖的區域,這些區域往往是線程之間失去同步的地方,而且會導致難以發掘的錯誤。Helgrind實現了名為” Eraser” 的競爭檢測算法,並做了進一步改進,減少了報告錯誤的次數。

Massif
  堆棧分析器,它能測量程序在堆棧中使用了多少內存,告訴我們堆塊,堆管理塊和棧的大小。Massif能幫助我們減少內存的使用,在帶有虛擬內存的現代系統中,它還能夠加速我們程序的運行,減少程序停留在交換區中的幾率

二. 使用Valgrind
Valgrind的使用非常簡單,valgrind命令的格式如下:

valgrind [valgrind-options]your-prog [your-prog options]

一些常用的選項如下:

-h --help

顯示幫助信息。

--version

顯示valgrind內核的版本,每個工具都有各自的版本。

-q --quiet

安靜地運行,只打印錯誤信息。

-v --verbose

打印更詳細的信息。

--tool= [default: memcheck]

最常用的選項。運行valgrind中名為toolname的工具。如果省略工具名,默認運行memcheck。

--db-attach= [default: no]

綁定到調試器上,便於調試錯誤。

我們通過例子看一下它的具體使用。我們構造一個存在內存洩漏的C程序,如下:

#include <stdio.h>

#include <stdlib.h>

int*Test(void)

{

int* x = malloc(10 * sizeof(int));

delete x;// problem 1: heap block overrun, problem 2: memory leak --x not free, only first address

return x;

}

int main(void)

{

int count;

Test();

printf("i =%d/n", count); //problem 3: use uninitialised value.

return 0;

}

$ gcc -Wall -o Test Test.c

$ valgrind --tool=memcheck ./ Test

$valgrind --tool=memcheck --leak-check=yes ./Test

三、安裝
sudo apt-get install valgrind

Linux下Valgrind的使用概述 http://www.linuxidc.com/Linux/2012-08/67990.htm

Linux下利用Valgrind工具進行內存洩露檢測和性能分析 http://www.linuxidc.com/Linux/2012-06/63754.htm

Ubuntu 內存洩漏檢測工具Valgrind的安裝 http://www.linuxidc.com/Linux/2011-12/49988.htm

Valgrind--Linux下的內存調試和代碼解剖工具 http://www.linuxidc.com/Linux/2011-06/36907.htm

應用 Valgrind 發現 Linux 程序的內存問題[圖文] http://www.linuxidc.com/Linux/2008-11/17502.htm

Copyright © Linux教程網 All Rights Reserved