linux内存泄露检查工具

文章目录

      • 内存泄漏检查工具
          • Valgrind
          • mtrace

内存泄漏检查工具

测试代码(包含mtrace部分):

$ cat test.c
#include 
#include 
#include 

int main() {
        mtrace();
        int *n = (int*)malloc(sizeof(int) * 4);
        muntrace();
        return 0;
}

编译:

#必须添加-g参数,不然无法确认是在哪个文件的第几行出现问题
$ gcc -g -o test test.c
Valgrind

可以检测数组越界、内存无效读取,内存泄漏

官网: https://www.valgrind.org/

下载地址: https://www.valgrind.org/downloads

#下载安装,当前最新版本3.18.1
curl -O https://sourceware.org/pub/valgrind/valgrind-3.18.1.tar.bz2
tar jvxf valgrind-3.18.1.tar.bz2
cd valgrind-3.18.1
./configue --prefix=`pwd`/build
make -j8
make install
#在结果中可看到test.c:7行存在内存泄漏
#其他情况可根据具体打印信息判断是否存在问题
$ valgrind --leak-check=full ./test
==20799== Memcheck, a memory error detector
==20799== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==20799== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==20799== Command: ./test
==20799==
==20799==
==20799== HEAP SUMMARY:
==20799==     in use at exit: 16 bytes in 1 blocks
==20799==   total heap usage: 1 allocs, 0 frees, 16 bytes allocated
==20799==
==20799== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1
==20799==    at 0x4C29F73: malloc (vg_replace_malloc.c:309)
==20799==    by 0x4005E3: main (test.c:7)
==20799==
==20799== LEAK SUMMARY:
==20799==    definitely lost: 16 bytes in 1 blocks
==20799==    indirectly lost: 0 bytes in 0 blocks
==20799==      possibly lost: 0 bytes in 0 blocks
==20799==    still reachable: 0 bytes in 0 blocks
==20799==         suppressed: 0 bytes in 0 blocks
==20799==
==20799== For lists of detected and suppressed errors, rerun with: -s
==20799== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
mtrace

只能检测内存泄漏及重复释放内存,centos未找到安装包

程序包含mtrace函数时会开启内存分配跟踪,muntrace关闭内存分配跟踪

mtrace需要运行程序才能生成跟踪日志,跟踪日志的路径需手动配置环境变量 MALLOC_TRACE

编译时需添加参数-g

$ export MALLOC_TRACE=./test.log
#运行程序
$ ./test
# 查看日志会有内存申请和释放的信息,如:@ ./test:[0x4005e4] + 0x1e96460 0x10
# 0x4005e4为内存地址,后边的+号表示申请内存
$ cat test.log
= Start
@ ./test:[0x4005e4] + 0x1e96460 0x10
= End
#查看内存地址对应哪行代码
$ addr2line -f -e test 0x4005e4
main
/home/mem_test/test.c:7
#使用mtrace检测是否存在内存泄漏
#mtrace  
$ mtrace ./test $MALLOC_TRACE
Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001e96460     0x10  at /home/mem_test/test.c:7

你可能感兴趣的:(linux,linux,运维,服务器)