Linux基础 - 内存问题定位工具 ASAN

背景

定位内存泄漏、内存越界读写等问题;

步骤

编译过程

ASAN =  -fsanitize=address -fsanitize=leak
CFLAG = $(ASAN)
LDFLAG = -lasan

运行时

# 先配置环境变量
## 开启检测内存泄漏
export ASAN_OPTIONS=detect_leaks=1
## 1:检测到错误是就关闭程序 0:不关闭
export ASAN_OPTIONS=${ASAN_OPTIONS}:halt_on_error=1
## 设置日志路径
export ASAN_OPTIONS=${ASAN_OPTIONS}:log_path='/tmp/a.log'

# 启动程序需要先配置库
LD_PRELOAD=/path/to/libasan.so.x ./yourapp

注意

如果需要检测库是否有问题,被引用的库也需要开启asan功能来编译;
即:需要检测哪个模块,就需要按编译过程跑一遍流程,这样函数就会被处理过;

平台兼容问题

IMX8MP平台

出现编译过程同时加入-fsanitize=address -fsanitize=leak,会导致LD_PRELOAD=/path/to/libasan.so.x ./yourapp出现coredump问题,十分难受,所以建议还是单独分开进行使用;

解决后的流程

lsan 编译阶段

export ASAN="-fsanitize=leak"
export CFLAG="${ASAN} -O0 -g"
export LDFLAG="-L/tmp/test_asan/image/usr/lib -llsan"
${CXX} ${CFLAG} ${LDFLAG} demo.c -o demo

运行阶段

# 先配置环境变量
## 开启检测内存泄漏
export ASAN_OPTIONS=detect_leaks=1
## 1:检测到错误是就关闭程序 0:不关闭
export ASAN_OPTIONS=${ASAN_OPTIONS}:halt_on_error=1
## 设置日志路径
export ASAN_OPTIONS=${ASAN_OPTIONS}:log_path='/tmp/leak.log'
LD_PRELOAD=/usr/lib/liblsan.so.0.0.0 ./demo

结果

在这里插入图片描述

asan 编译阶段

export ASAN="-fsanitize=address"
export CFLAG="${ASAN} -O0 -g"
export LDFLAG="-L/tmp/test_asan/image/usr/lib -lasan"
${CXX} ${CFLAG} ${LDFLAG} demo.c -o demo

运行阶段

# 先配置环境变量
## 开启检测内存泄漏
export ASAN_OPTIONS=detect_leaks=1
## 1:检测到错误是就关闭程序 0:不关闭
export ASAN_OPTIONS=${ASAN_OPTIONS}:halt_on_error=1
## 设置日志路径
export ASAN_OPTIONS=${ASAN_OPTIONS}:log_path='/tmp/leak.log'
LD_PRELOAD=/usr/lib/libasan.so.x ./demo

结果

在这里插入图片描述

demo 代码

#include <cstdio>
#include <unistd.h>
#include <cstring>

int main() {
    printf("hello start\n");
    int count = 0;
    int* a = new int[10]; // 分配但未释放
    int* b = new int[20];
    memset(a, 0, sizeof(int) * 10);
    memset(b, 0, sizeof(int) * 20);
    delete[] b; // 正确释放

    while (count < 10) {
        b = new int[20]; //疯狂泄漏
        printf("a[0]:%d b[0]:%d\n", a[0], b[0]);
        sleep(1);
        count++;
    }
    printf("b[21]:%d over read!\n", b[21]);
    printf("hello end\n");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值