目录

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)的介绍和使用相关推荐

  1. 内存泄漏检测工具asan

    1.使用内存泄漏工具asan需要添加编译选项 -Lasan -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer ...

  2. Linux下内存检测工具:asan

    Linux下内存检测工具:asan ASAN(Address-Sanitizier)早先是LLVM中的特性,后被加入GCC 4.8,在GCC 4.9后加入对ARM平台的支持.因此GCC 4.8以上版本 ...

  3. Windows系统内存分析工具的介绍

    Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管 ...

  4. Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

    详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...

  5. ASan(Linux),gcc4.8以上版本自带的内存检查工具

    转自:http://shafeng.github.io/2017/05/10/asan/ 最近线上的程序总是莫名其妙崩溃,因为我们的项目使用了分布负载的机制,对于玩家的影响其实很小,但是我肯定是忍不了 ...

  6. 内存分析工具MAT介绍

    MAT(Memory Analyzer Tool)是一个基于Eclipse的内存分析工具,是一个快速.功能丰富的java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 官网地址:htt ...

  7. 【内存】memtest86内存测试工具介绍

    简介 memtest86工具,如名字所述,就是测试内存的工具. 可以在如下的网站下载到免费版本: MemTest86 - Download now! 目前该工具只支持x86平台. 目前最新的是7.4版 ...

  8. 内存检测工具:sanitizer

    1. 背景 内存泄漏是一个比较常见的问题,之前使用的是valgrind来实现内存检查的情况比较多,这里介绍一种更加便利的内存检测工具, 那就是gcc自带的sanitizer. 2. sanitizer ...

  9. C/C++内存检测工具Sanitizers

    Sanitizers介绍 Sanitizers 是谷歌开源的内存检测工具,包括AddressSanitizer.MemorySanitizer.ThreadSanitizer.LeakSanitize ...

  10. valgrind 内存泄漏_应用 AddressSanitizer 发现程序内存错误

    应用 AddressSanitizer 发现程序内存错误 作为 C/ C++ 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏.过去常用的工具是 Valgrind,但使用 ...

最新文章

  1. MyCat - 使用篇(1)
  2. Exchange 2013/2016动态通讯组成员查询
  3. js 为false的几种情况
  4. php无刷新实现页面更新,使用laravel和ajax实现整个页面无刷新的操作方法
  5. 简练软考知识点整理-规划风险应对
  6. Java连接SQL Server 2012【查看自己电脑上的SQL Server端口号;附:jar包】
  7. 转:Memcached详解
  8. qchart画完以后删除_冬天的夜晚很难画?老师分步骤教你画,简单易学,收藏起来临摹...
  9. 献给 Python 开发人员的 25 个最佳 GitHub 代码库!
  10. SpringBoot默认日志logback配置解析
  11. 支持向量机SVM的学习笔记
  12. 风中的纸屑——阅读MDN中的HTML、CSS谈兼容(PC)
  13. 一些简单的道理和习惯
  14. 风吹衣袖,月上西楼- 一个技术人员的心声
  15. 谁说不同品牌内存无法兼容-关键调整频率和内存时序
  16. layer弹出层不居中
  17. 自定义QT标题栏和背景·边框
  18. 【数学和算法】特征值、特征向量、特征空间,变换矩阵的行列式和特征值
  19. 12-Web安全—基于SQL Server的报错注入——and,conver,cast
  20. 分分钟上手 VS Code

热门文章

  1. 《关键对话:如何高效能沟通(原书第2版)》 摘录及总结
  2. 非Build Rebuild--Compilation of Maven projects is supported only if external build is started from an
  3. 使用jquery对接高德地图地址四级联动
  4. item_search - 根据关键词取拼多多商品列表
  5. python判断闰年和平年
  6. javaweb项目实现连续3次输错密码后禁止登录
  7. 传说中WM手机工程测试命令
  8. 虚幻引擎4(UE4)的基本操作Actor的操作
  9. 程序员,职场上请远离这种人!
  10. 采集PMS7003 颗粒度传感器数据,显示在TFT屏幕上,并通过webapi上传(1/2)