valgrind 工具介紹和簡單的使用


最近老是遇上各種奇奇怪怪的core dump,不太會分析的情況下看到了這款工具。在這記錄分享下。

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

Valgrind 安裝:

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

安裝過程:(可以直接查看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 -l

 

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 (非常詳細的介紹了每個工具的使用)

 


免責聲明!

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



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