当前位置: 首页 > news >正文

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 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.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内存检测工具实例
http://www.lryc.cn/news/544769.html

相关文章:

  • 本地部署deepseek大模型后使用c# winform调用(可离线)
  • Python----数据分析(Numpy:安装,数组创建,切片和索引,数组的属性,数据类型,数组形状,数组的运算,基本函数)
  • Leetcode-最大矩形(单调栈)
  • 域内委派维权
  • leetcode---LCR 140.训练计划
  • Linux基础 -- ARM 32位常用机器码(指令)整理
  • 内存中的缓存区
  • 基于 Spring Boot 的 +Vue“宠物咖啡馆平台” 系统的设计与实现
  • LeetCode 解题思路 7(Hot 100)
  • linux-Dockerfile及docker-compose.yml相关字段用途
  • deepseek部署:ELK + Filebeat + Zookeeper + Kafka
  • 微软Office 2016-2024 x86直装版 v16.0.18324 32位
  • CMake宏定义管理:如何优雅处理第三方库的宏冲突
  • 【SpringCloud】Gateway
  • Maven入门教程
  • 大数据与金融科技:革新金融行业的动力引擎
  • Autosar RTE配置-Port Update配置及使用-基于ETAS工具
  • 【AVRCP】深入理解蓝牙音频 / 视频远程控制规范:从基础到应用
  • AWS SQS跨账户访问失败排查指南
  • 算法训练(leetcode)二刷第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
  • 【JavaWeb学习Day20】
  • 2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(二级)真题 + 答案
  • 一、对iic类模块分析与使用
  • ROS 2机器人开发--CMakeLists.txt 文件详解
  • kan与小波,和不知所云的画图
  • 使用DeepSeek实现自动化编程:类的自动生成
  • 算法题:快速排序
  • Python的那些事第三十六篇:基于 Vega 和 Vega-Lite 的数据可视化解决方案,Altair 声明式可视化库
  • aws(学习笔记第三十课) 练习使用transit gateway
  • Phpstudy中的MySQL无法正常启动或启动后自动暂停,以及sqlilab环境搭建出现的问题解决方法