内存错误分析工具----asan(AddressSanitizer)的介绍和使用
目录
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那里有错误。
内存错误分析工具----asan(AddressSanitizer)的介绍和使用相关推荐
- 内存泄漏检测工具asan
1.使用内存泄漏工具asan需要添加编译选项 -Lasan -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer ...
- Linux下内存检测工具:asan
Linux下内存检测工具:asan ASAN(Address-Sanitizier)早先是LLVM中的特性,后被加入GCC 4.8,在GCC 4.9后加入对ARM平台的支持.因此GCC 4.8以上版本 ...
- Windows系统内存分析工具的介绍
Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管 ...
- Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用
详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...
- ASan(Linux),gcc4.8以上版本自带的内存检查工具
转自:http://shafeng.github.io/2017/05/10/asan/ 最近线上的程序总是莫名其妙崩溃,因为我们的项目使用了分布负载的机制,对于玩家的影响其实很小,但是我肯定是忍不了 ...
- 内存分析工具MAT介绍
MAT(Memory Analyzer Tool)是一个基于Eclipse的内存分析工具,是一个快速.功能丰富的java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 官网地址:htt ...
- 【内存】memtest86内存测试工具介绍
简介 memtest86工具,如名字所述,就是测试内存的工具. 可以在如下的网站下载到免费版本: MemTest86 - Download now! 目前该工具只支持x86平台. 目前最新的是7.4版 ...
- 内存检测工具:sanitizer
1. 背景 内存泄漏是一个比较常见的问题,之前使用的是valgrind来实现内存检查的情况比较多,这里介绍一种更加便利的内存检测工具, 那就是gcc自带的sanitizer. 2. sanitizer ...
- C/C++内存检测工具Sanitizers
Sanitizers介绍 Sanitizers 是谷歌开源的内存检测工具,包括AddressSanitizer.MemorySanitizer.ThreadSanitizer.LeakSanitize ...
- valgrind 内存泄漏_应用 AddressSanitizer 发现程序内存错误
应用 AddressSanitizer 发现程序内存错误 作为 C/ C++ 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏.过去常用的工具是 Valgrind,但使用 ...
最新文章
- MyCat - 使用篇(1)
- Exchange 2013/2016动态通讯组成员查询
- js 为false的几种情况
- php无刷新实现页面更新,使用laravel和ajax实现整个页面无刷新的操作方法
- 简练软考知识点整理-规划风险应对
- Java连接SQL Server 2012【查看自己电脑上的SQL Server端口号;附:jar包】
- 转:Memcached详解
- qchart画完以后删除_冬天的夜晚很难画?老师分步骤教你画,简单易学,收藏起来临摹...
- 献给 Python 开发人员的 25 个最佳 GitHub 代码库!
- SpringBoot默认日志logback配置解析
- 支持向量机SVM的学习笔记
- 风中的纸屑——阅读MDN中的HTML、CSS谈兼容(PC)
- 一些简单的道理和习惯
- 风吹衣袖,月上西楼- 一个技术人员的心声
- 谁说不同品牌内存无法兼容-关键调整频率和内存时序
- layer弹出层不居中
- 自定义QT标题栏和背景·边框
- 【数学和算法】特征值、特征向量、特征空间,变换矩阵的行列式和特征值
- 12-Web安全—基于SQL Server的报错注入——and,conver,cast
- 分分钟上手 VS Code
热门文章
- 《关键对话:如何高效能沟通(原书第2版)》 摘录及总结
- 非Build Rebuild--Compilation of Maven projects is supported only if external build is started from an
- 使用jquery对接高德地图地址四级联动
- item_search - 根据关键词取拼多多商品列表
- python判断闰年和平年
- javaweb项目实现连续3次输错密码后禁止登录
- 传说中WM手机工程测试命令
- 虚幻引擎4(UE4)的基本操作Actor的操作
- 程序员,职场上请远离这种人!
- 采集PMS7003 颗粒度传感器数据,显示在TFT屏幕上,并通过webapi上传(1/2)