- 内存泄漏检查工具
- 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.cValgrind
可以检测数组越界、内存无效读取,内存泄漏
官网: 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



