valgrind 工具介紹和簡單的使用

最近總是趕上各類奇奇怪怪的core dump,不太會分析的狀況下看到了這款工具。在這記錄分享下。html

Valgrind 是個開源的工具,功能不少。例如檢查內存泄漏工具---memcheck。linux

Valgrind 安裝:ios

去官網下載: http://valgrind.org/downloads/current.html#currentvim

安裝過程:(能夠直接查看README文檔來確認安裝過程)緩存

    tools/valgrind-3.12.0> pwd
    /proj/MPS_DEV_REPO/xchonxu/tools
    > tar -jxf valgrind-3.12.0.tar.bz2
    > cd /proj/MPS_DEV_REPO/xchonxu/tools/valgrind-3.12.0
    > vim README
    > ls
    > ./autogen.sh
    > ./configure --prefix=/home/xchonxu/bin
    > make
    > make install多線程

    驗證是否成功:
    > cd ~
    > ls
    > cd bin/
    > ls
    > cd bin/
    > ls
    > ./valgrind ls -l
    > ./valgrind --leak-check=full ls -lsocket

 

Valgrind 命令介紹:函數

用法: valgrind [options] prog-and-args
[options]: 經常使用選項,適用於全部Valgrind工具

    -tool=<name> 最經常使用的選項。運行 valgrind中名爲toolname的工具。默認memcheck。工具

        memcheck ------> 這是valgrind應用最普遍的工具,一個重量級的內存檢查器,可以發現開發中絕大多數內存錯誤使用狀況,好比:使用未初始化的內存,使用已經釋放了的內存,內存訪問越界等。網站

        callgrind ------> 它主要用來檢查程序中函數調用過程當中出現的問題。

        cachegrind ------> 它主要用來檢查程序中緩存使用出現的問題。

        helgrind ------> 它主要用來檢查多線程程序中出現的競爭問題。

        massif ------> 它主要用來檢查程序中堆棧使用中出現的問題。

        extension ------> 能夠利用core提供的功能,本身編寫特定的內存調試工具

    -h –help 顯示幫助信息。
    -version 顯示valgrind內核的版本,每一個工具都有各自的版本。
    -q –quiet 安靜地運行,只打印錯誤信息。
    -v –verbose 更詳細的信息, 增長錯誤數統計。
    -trace-children=no|yes 跟蹤子線程? [no]
    -track-fds=no|yes 跟蹤打開的文件描述?[no]
    -time-stamp=no|yes 增長時間戳到LOG信息? [no]
    -log-fd=<number> 輸出LOG到描述符文件 [2=stderr]
    -log-file=<file> 將輸出的信息寫入到filename.PID的文件裏,PID是運行程序的進行ID
    -log-file-exactly=<file> 輸出LOG信息到 file
    -log-file-qualifier=<VAR> 取得環境變量的值來作爲輸出信息的文件名。 [none]
    -log-socket=ipaddr:port 輸出LOG到socket ,ipaddr:port

LOG信息輸出

    -xml=yes 將信息以xml格式輸出,只有memcheck可用
    -num-callers=<number> show <number> callers in stack traces [12]
    -error-limit=no|yes 若是太多錯誤,則中止顯示新錯誤? [yes]
    -error-exitcode=<number> 若是發現錯誤則返回錯誤代碼 [0=disable]
    -db-attach=no|yes 當出現錯誤,valgrind會自動啓動調試器gdb。[no]
    -db-command=<command> 啓動調試器的命令行選項[gdb -nw %f %p]

適用於Memcheck工具的相關選項:

    -leak-check=no|summary|full 要求對leak給出詳細信息? [summary]
    -leak-resolution=low|med|high how much bt merging in leak check [low]
    -show-reachable=no|yes show reachable blocks in leak check? [no]

 

最經常使用的命令格式:

valgrind --tool=memcheck --leak-check=full ./test

 

案例介紹:

申請內存未釋放:

xchonxu/testCode> cat testValgrind.cc
#include <iostream>

using namespace std;

int main()
{
    int *a = new int(2);

    //delete a;

    return 0;
}

xchonxu/testCode> g++ -g -o testValgrind testValgrind.cc
xchonxu/testCode> ~/bin/bin/valgrind --tool=memcheck --leak-check=full ./testValgrind
==3598== Memcheck, a memory error detector
==3598== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==3598== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==3598== Command: ./testValgrind
==3598==
==3598==
==3598== HEAP SUMMARY:
==3598==     in use at exit: 4 bytes in 1 blocks
==3598==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==3598==
==3598== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==3598==    at 0x4C292DF: operator new(unsigned long) (vg_replace_malloc.c:332)
==3598==    by 0x4007AF: main (testValgrind.cc:7)
==3598==
==3598== LEAK SUMMARY:
==3598==    definitely lost: 4 bytes in 1 blocks
==3598==    indirectly lost: 0 bytes in 0 blocks
==3598==      possibly lost: 0 bytes in 0 blocks
==3598==    still reachable: 0 bytes in 0 blocks
==3598==         suppressed: 0 bytes in 0 blocks
==3598==
==3598== For counts of detected and suppressed errors, rerun with: -v
==3598== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)

    Memcheck將內存泄露分爲兩種,一種是可能的內存泄露(Possibly lost),另一種是肯定的內存泄露(Definitely lost)。Possibly lost 是指仍然存在某個指針可以訪問某塊內存,但該指針指向的已經不是該內存首地址。Definitely lost 是指已經不可以訪問這塊內存。而Definitely lost又分爲兩種:直接的(direct)和間接的(indirect)。直接和間接的區別就是,直接是沒有任何指針指向該內存,間接是指指向該內存的指針都位於內存泄露處。在上述的例子中,根節點是directly lost,而其餘節點是indirectly lost

 

原理:

 

 

 

 

參考網站:

http://www.linuxidc.com/Linux/2012-06/63754.htm
http://elinux.org/Valgrind (wiki)
http://blog.csdn.net/sduliulun/article/details/7732906
http://blog.csdn.net/gatieme/article/details/51959654(比較全面的介紹)
http://www.linuxidc.com/Linux/2012-06/63754.htm (很是詳細的介紹了每一個工具的使用)

相關文章
相關標籤/搜索