文章目录
- 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内存检测工具实例