免费域名网站查询,建筑网站图片,销售员做网站,观山湖区网站建设文章目录 strace检测asan内存检测linux下gperf工具#xff08;tcmalloc#xff09;检查C/C代码内存泄露问题参考 strace检测
#xff08;1#xff09;启动程序
#xff08;2#xff09;
strace -f -p PID -tt -e brk,mmap,mmap2,munmapbrk 变大 → 说明堆增长… 文章目录 strace检测asan内存检测linux下gperf工具tcmalloc检查C/C代码内存泄露问题参考 strace检测
1启动程序
2
strace -f -p PID -tt -e brk,mmap,mmap2,munmapbrk 变大 → 说明堆增长malloc分配。mmap 变多但 munmap 没有减少 → 可能是 mmap 泄漏。
类似还有ltrace
ltrace -p PID -e malloc,free,realloc如果 malloc 数量远大于 free说明可能有 内存泄漏。
asan内存检测
gcc和clang编译选项主要是-fsanitizeaddress
gcc ex1.c -o ex1 -g -fsanitizeaddress -fsanitize-recoveraddress -fno-omit-frame-pointer -fno-common asan会在运行时检测内存问题运行时需要添加几个环境变量
ASAN_OPTIONSdetect_leaks1:halt_on_error0:alloc_dealloc_mismatch0:log_path/tmp/asan_pgsql.log \
LSAN_OPTIONSexitcode0:suppressions/tmp/asan_supp
LD_PRELOAD/usr/local/lib64/libasan.so \
./ex1ASAN_OPTIONS配置ASAN。LSAN_OPTIONS配置LSAN有些LSAN特殊的配置加在这里比如suppressions忽略一些文件。halt_on_error出现问题不停止程序运行。alloc_dealloc_mismatch不允许内存申请不配对的情况例如malloc / delete。 l- og_path结果输出到文件中不打印到标准输出。exitcodeLSAN的配置遇到问题不退出。suppressionsLSAN支持不检查一些文件。LD_PRELOAD二进制可以不link libasan.so加环境变量LD_PRELOAD即可。或者编译时Link libasan.so可以省略该配置。
cmake
1. 编译宏添加set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -fsanitizeaddress)
2. 执行LD_PRELOAD/usr/lib/gcc/x86_64-linux-gnu/11/libasan.so ASAN_OPTIONShalt_on_error0:detect_leaks1:malloc_context_size15:log_path./asan.log ./program# halt_on_error0检测内存错误后继续运行
# detect_leaks1:使能内存泄露检测
# malloc_context_size15内存错误发生时显示的调用栈层数为15
# log_path/home/xos/asan.log:内存检查问题日志存放文件路径
# suppressions$SUPP_FILE:屏蔽打印某些内存错误tet case
#include stdio.h
#include stdlib.h
#include string.hint 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 -fsanitizeaddress -fsanitize-recoveraddress -fno-omit-frame-pointer -fno-common
执行
ASAN_OPTIONShalt_on_error0:alloc_dealloc_mismatch0:log_path/tmp/asan_pgsql.log \
LD_PRELOAD/usr/local/lib64/libasan.so \
./ex1
结果
$ cat /tmp/asan_pgsql_01.log.652
652ERROR: LeakSanitizer: detected memory leaksDirect 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.60x22554)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 --hostaarch64-linux-gnu CCaarch64-linux-gnu-gcc CXXaarch64-linux-gnu-g --prefix$PWD/install --enable-frame-pointers make -j10
make install
参考
asan内存检测工具实例