主页 > 手机  > 

Linux检测内存泄漏方法总结

Linux检测内存泄漏方法总结

文章目录 strace检测asan内存检测linux下gperf工具(tcmalloc)检查C/C++代码内存泄露问题参考

strace检测

(1)启动程序

(2)

strace -f -p <PID> -tt -e brk,mmap,mmap2,munmap brk 变大 → 说明堆增长(malloc分配)。mmap 变多但 munmap 没有减少 → 可能是 mmap 泄漏。

类似还有ltrace:

ltrace -p <PID> -e malloc,free,realloc

如果 malloc 数量远大于 free,说明可能有 内存泄漏。

asan内存检测

gcc和clang编译选项:主要是-fsanitize=address

gcc ex1.c -o ex1 -g -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer -fno-common

asan会在运行时检测内存问题,运行时需要添加几个环境变量:

ASAN_OPTIONS='detect_leaks=1:halt_on_error=0:alloc_dealloc_mismatch=0:log_path=/tmp/asan_pgsql.log' \ LSAN_OPTIONS='exitcode=0:suppressions=/tmp/asan_supp' LD_PRELOAD=/usr/local/lib64/libasan.so \ ./ex1 ASAN_OPTIONS:配置ASAN。LSAN_OPTIONS:配置LSAN,有些LSAN特殊的配置加在这里,比如suppressions忽略一些文件。halt_on_error:出现问题不停止程序运行。alloc_dealloc_mismatch:不允许内存申请不配对的情况,例如malloc / delete。 l- og_path:结果输出到文件中,不打印到标准输出。exitcode:LSAN的配置,遇到问题不退出。suppressions:LSAN支持不检查一些文件。LD_PRELOAD:二进制可以不link libasan.so,加环境变量LD_PRELOAD即可。或者编译时Link libasan.so,可以省略该配置。

cmake

1. 编译宏添加 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") 2. 执行 LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/11/libasan.so ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:malloc_context_size=15:log_path=./asan.log ./program # halt_on_error=0:检测内存错误后继续运行 # detect_leaks=1:使能内存泄露检测 # malloc_context_size=15:内存错误发生时,显示的调用栈层数为15 # log_path=/home/xos/asan.log:内存检查问题日志存放文件路径 # suppressions=$SUPP_FILE:屏蔽打印某些内存错误

tet case

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { void *dst = malloc(8); void *src = "1234567"; memcpy(dst, src, 8); printf("%s\n", (char *) dst); return 0; }

编译

gcc ex1.c -o ex1 -g -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer -fno-common

执行

ASAN_OPTIONS='halt_on_error=0:alloc_dealloc_mismatch=0:log_path=/tmp/asan_pgsql.log' \ LD_PRELOAD=/usr/local/lib64/libasan.so \ ./ex1

结果

$ cat /tmp/asan_pgsql_01.log.652 ================================================================= ==652==ERROR: LeakSanitizer: detected memory leaks Direct leak of 8 byte(s) in 1 object(s) allocated from: #0 0x7f04db292f08 in __interceptor_malloc ../../../../libsanitizer/asan/asan_malloc_linux.cc:144 #1 0x400853 in main /data02/mingjie/pgroot99/pgsrc/test/ex1.c:7 #2 0x7f04dabdd554 in __libc_start_main (/lib64/libc.so.6+0x22554) SUMMARY: AddressSanitizer: 8 byte(s) leaked in 1 allocation(s). linux下gperf工具(tcmalloc)检查C/C++代码内存泄露问题 linux下gperf工具(tcmalloc)检查C/C++代码内存泄露问题GDB调试无行号,报dwarf error问题解决

交叉编译linux aarch64:

./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ --prefix="$PWD/install" --enable-frame-pointers make -j10 make install 参考 asan内存检测工具实例
标签:

Linux检测内存泄漏方法总结由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Linux检测内存泄漏方法总结