内存错误分析工具----asan(AddressSanitizer)的介绍和使用

本文讲述了作者在项目中使用ASAN工具解决内存泄漏问题的过程,介绍了ASAN的原理、使用前提、编译方法和关键配置,重点突出了ASAN在检测内存问题上的优势和与Valgrind的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 ASAN介绍

2 使用前提

2.1 gcc版本大于4.8

 2.2 系统中有asan

3 使用方法

3.1 makefile中增加编译选项-fsanitize=address -g

3.2 makefile中链接libasan.so库

3.3 export选项

4 编译运行可执行程序


在项目中遇到了一个内存泄漏的问题,最开始用valgrind工具分析,后来发现valgrind不太好用,没能找到原因,后来用asan找到了内存泄漏的点,问题解决写篇博客记录下asan工具的使用,供以后使用。

1 ASAN介绍

ASAN,全称 AddressSanitizer,也即地址消毒技术。可以用来检测内存问题,例如缓冲区溢出或对悬空指针的非法访问等。根据谷歌的工程师介绍 ASAN 已经在 chromium 项目上检测出了300多个潜在的未知bug,而且在使用 ASAN 作为内存错误检测工具对程序性能损耗也是及其可观的。根据检测结果显示可能导致性能降低2倍左右,比Valgrind(官方给的数据大概是降低10-50倍)快了一个数量级。而且相比于Valgrind只能检查到堆内存的越界访问和悬空指针的访问,ASAN 不仅可以检测到堆内存的越界和悬空指针的访问,还能检测到栈和全局对象的越界访问。这也是 ASAN 在众多内存检测工具的比较上出类拔萃的重要原因,基本上现在 C/C++ 项目都会使用ASAN来保证产品质量,尤其是大项目中更为需要。

2 使用前提

2.1 gcc版本大于4.8

再网上看到说gcc版本大于4.8才可以用asan,我的gcc满足该要求

 2.2 系统中有asan

 我在板子上搜索了一下,发现是存在这个库的。

3 使用方法

3.1 makefile中增加编译选项-fsanitize=address -g

CFLAGS  += $(foreach dir, $(INCLUDE_PATH), -I$(dir))  -fvisibility=hidden  -fsanitize=address -g

上面的编译选项,前面的是本来就有的,后面的-fsanitize=address -g后来新加的。

3.2 makefile中链接libasan.so库

-lasan

3.3 export选项

ASAN_OPTIONS是Address-Sanitizier的运行选项环境变量。

# halt_on_error=0:检测内存错误后继续运行

# detect_leaks=1:使能内存泄露检测

# malloc_context_size=15:内存错误发生时,显示的调用栈层数为15

# log_path=/home/xos/asan.log:内存检查问题日志存放文件路径

# suppressions=$SUPP_FILE:屏蔽打印某些内存错误

除了上述常用选项,以下还有一些选项可根据实际需要添加:

# detect_stack_use_after_return=1:检查访问指向已被释放的栈空间

# handle_segv=1:处理段错误;也可以添加handle_sigill=1处理SIGILL信号

# quarantine_size=4194304:内存cache可缓存free内存大小4M

我这里使用的是

export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:malloc_context_size=15:log_path=./asan.log

4 编译运行可执行程序

 这里需要注意,只有可执行程序正常执行完才能有log文件,如果是自己ctrl+c中断程序或者程序报错异常退出,都不会有log文件。

程序执行完之后产生的log文件如下所示,我摘抄一部分

 log里面还会帮你行出错的行号也写上,我这里是在push_back那里有错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈 洪 伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值