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

相关文章
相关标签/搜索