linux C/C++內存檢測

  •  MTRACE

glibc提供了一個檢查內存泄漏的方法, 前提是你的程序使用glibc的標準函數 分配內存(如malloc, alloc...): 緩存

1. 在須要內存泄漏檢查的代碼的開始調用void mtrace(void) (在mcheck.h中有聲明). mtrace爲malloc等函數安裝hook, 用於記錄內存分配信息. 在須要內存泄漏檢查的代碼的結束調用void muntrace(void). 
注意: 通常狀況下不要調用muntrace, 而讓程序天然結束. 由於可能有些釋放內存代碼要到muntrace以後才運行. 
2. 用debug模式編譯被檢查代碼(-g或-ggdb) 
3. 設置環境變量MALLOC_TRACE爲一文件名, 這一文件將存有內存分配信息. 
4. 運行被檢查程序, 直至結束或muntrace被調用. 
5. 用mtrace命令解析內存分配Log文件($MALLOC_TRACE) , (mtrace foo $MALLOC_TRACE, where foo is the executible name) ,若是有內存泄漏, mtrace會輸出分配泄漏內存的代碼位置,以及分配數量.bash

  • valgrind

 下載完成後執行安裝多線程

#sh sutogen.sh
#./configure
#make
#make install

 

執行 valgrind ls -l 來驗證是否成功socket

valgrind用法:函數

valgrind [options] [program]工具

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

[options]: 經常使用選項,適用於全部Valgrind工具

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

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

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

        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]

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

相關文章
相關標籤/搜索