天天看點

Linux 記憶體調試工具- Valgrind 使用初探(轉)

轉自http://www.cppblog.com/liu1061/articles/55007.html

Valgrind 是在linux系統下開發應用程式時用于調試記憶體問題的工具。它尤其擅長發現記憶體管理的問題,它可以檢查程式運作時的記憶體洩漏問題。

   它的官方網址是 http://www.valgrind.org/

   下載下傳最新版本的Valgrind,目前是3.2.0。 wget http://www.valgrind.org/downloads/valkyrie-1.2.0.tar.bz2

   執行正常的安裝步驟:./confgure && make && make install。注意: 系統必須安裝QT的開發包。即便這樣在make 時還是出現qplatformdefs.h這個檔案找不到的情況,導緻make失敗。查找系統中的qplatformdefs.h 之後,發現沒有存在于qt的标準頭檔案目錄/usr/lib/qt-3.3/include。如是将/usr/lib/qt-3.3/mkspecs /linux-g++/ 目錄下該頭檔案複制标準頭檔案目錄,重新make ,後面一切OK。

初次使用      
編譯如下代碼:  gcc -Wall example.c -g -o example       
#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(void)

            {

            f();

            return 0;

            }      

     注意:gcc 的-g 選項讓Valgrind調試輸出時指出相應資訊的代碼所在的行号。

valgrind --tool=memcheck --leak-check=yes ./example

==6742== Memcheck, a memory error detector for x86-linux.

==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.

==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux.

==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.

==6742== For more details, rerun with: -v

==6742==

==6742== Invalid write of size 4

==6742==    at 0x8048384: f (example.c:6)

==6742==    by 0x80483AC: main (example.c:12)

==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

==6742==

==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)

==6742== malloc/free: in use at exit: 40 bytes in 1 blocks.

==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

==6742== For counts of detected errors, rerun with: -v

==6742== searching for pointers to 1 not-freed blocks.

==6742== checked 1360800 bytes.

==6742==

==6742==

==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

==6742==

==6742== LEAK SUMMARY:

==6742==    definitely lost: 40 bytes in 1 blocks.

==6742==    possibly lost:   0 bytes in 0 blocks.

==6742==    still reachable: 0 bytes in 0 blocks.

==6742==         suppressed: 0 bytes in 0 blocks.

==6742== Reachable blocks (those to which a pointer was found) are not shown.

==6742== To see them, rerun with: --show-reachable=yes

   上面的C程式存在兩個錯誤:1. 數組下标越界;2. 配置設定的記憶體沒有釋放,存在記憶體洩露的問題。對于錯誤1,看Valgrind的調試資訊片斷

==6742== Invalid write of size 4

==6742==    at 0x8048384: f (example.c:6)

==6742==    by 0x80483AC: main (example.c:12)

==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

對于錯誤2,看這個

==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

......

==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

繼續閱讀