一、ASAN 简介

ASAN(AddressSanitizer 的缩写)是一款面向C/C++语言的内存错误问题检查工具,可以检测如下内存问题:

  • 使用已释放内存(野指针)
  • 堆内存越界(读写)
  • 栈内存越界(读写)
  • 全局变量越界(读写)
  • 函数返回局部变量
  • 内存泄漏

ASAN工具主要由两部分组成:

运行时库
运行时库(libasan.so.x)会接管 malloc 和 free 函数。malloc执行完后,已分配内存的前后(称为“红区”)会被标记为“中毒”状态,而释放的内存则会被隔离起来(暂时不会分配出去)且也会被标记为“中毒”状态。

编译器插桩模块
加了ASAN相关的编译选项后,代码中的每一次内存访问操作都会被编译器修改为如下方式:

编译前:

*address = ...;  // or: ... = *address;

编译后:

if (IsPoisoned(address)) {ReportError(address, kAccessSize, kIsWrite);
}
*address = ...;  // or: ... = *address;

https://github.com/google/sanitizers/wiki/AddressSanitizerFlags

二、ASAN 安装

Ubuntu 安装命令:

sudo apt-get install libasan0

CentOS 安装命令:

sudo yum install libasan

三、ASAN 使用

(1)gcc 编译选项

# -fsanitize=address:开启内存越界检测
# -fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;若未设置此选项,则内存出错即报错退出
# -fno-stack-protector:去使能栈溢出保护
# -fno-omit-frame-pointer:去使能栈溢出保护

(2)ASAN_OPTIONS 设置

ASAN_OPTIONS是AddressSanitizier的运行选项环境变量。

# halt_on_error=0:检测内存错误后继续运行
# detect_leaks=1:使能内存泄露检测
# malloc_context_size=15:内存错误发生时,显示的调用栈层数
# log_path=/home/asan.log:内存检查问题日志存放文件路径# export ASAN_OPTIONS=halt_on_error=0:use_sigaltstack=0:detect_leaks=1:malloc_context_size=15:log_path=/tmp/asan.log
# env |grep ASAN_OPTIONS

(3)编译运行

#include <stdio.h>
#include <stdlib.h>int main()
{char *ptr = (char *)malloc(10);ptr = NULL;return 0;
}

-g 保留代码文字信息

gcc -g main.c -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -o mainASAN_OPTIONS=log_path=/root/test/asan.log ./main

ps:
1,addr2line参数介绍:

-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=<bfdname>:指定目标文件的格式为bfdname。
-e --exe=<executable>:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=<name>:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号

2,使用如下脚本可以将asan日志中的(so+偏移地址)转化为(文件+行数)。需安装debuginfo

cat $1|while read line;doif [ $(echo $line|grep -o '(.*+.*)'|wc -l) = 1 ];thena=$(echo $line|cut -d '(' -f1)b=$(echo $line|cut -d '(' -f2|cut -d ')' -f1|awk -F '+' '{print $1}')c=$(echo $line|cut -d '(' -f2|cut -d ')' -f1|awk -F '+' '{print $2}')if [ -z "$b" ] || [ -z "$c" ]; thenecho $linecontinuefid=$(addr2line -e $b $c)if [ $(echo $d|grep '?'|wc -l) = 0 ];thenecho -e "\t$a($d)"elseecho -e "\t$line"fielseecho $linefi
done

asan c/c++内存检测相关推荐

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

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

  2. 内存检测工具:sanitizer

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

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

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

  4. 内存检测工具Dr. Memory的使用

    Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问.内存非法访问.数组越界读/写.以及内存泄露等.它可以在Linux.Windo ...

  5. 动态内存检测工具Valgrind

    1. Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来 ...

  6. windows7内存诊断工具有用吗_Win7怎么使用自带工具进行内存检测?

    电脑使用久了,总是会出现各种各样的问题,其中比较常见的就是内存问题了.出现内存问题,我们可以采用系统自带的工具进行内存检测,可是很多用户不知道Win7怎么使用自带工具进行内存检测,为此小编赶紧整理了以 ...

  7. 【调试】Linux下超强内存检测工具Valgrind

    [调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...

  8. Visual Leak Detector 2 2 3 Visual C++内存检测工具

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Visu ...

  9. 【内存检测系列】window下windbg内存泄漏检查

    文章目录 1.使用windbg中的umdh检查 1.1. 工具下载 1.2.环境配置 1.3.利用工具umdh(user-mode dump heap)分析 1.4.利用umdh创建heap快照 2. ...

  10. u盘内存怎么测试软件,U盘下的内存检测软件

    现在市面上的闪存条品牌繁多,型号复杂. 特别是现在有许多通过修改SPD信息来骗过主板BIOS的检测,所以就出现了一些扩容内存,有坏块的内存. 而且用普通的方法还无法检测出来,如何使我们能够买到一条放心 ...

最新文章

  1. 二叉树总结—建树和4种遍历方式(递归非递归)
  2. C# 值类型的局限性
  3. 条件转移指令和无条件转移指令练习
  4. Hybris商品图片导入与压缩有关的配置.
  5. SpringCloud Alibaba - Nacos 作为配置中心 读取Properties配置信息
  6. Linux系统LVM逻辑卷工作原理,必看~
  7. HTML5体感游戏《守护拉普达》诞生记
  8. matlab练习程序(图像序列合成视频)
  9. 基于HMM的语音识别技术原理
  10. 多目标最优化模型及算法应用(NSGA-II)
  11. 谷歌浏览器设置跨域方法集合
  12. 2020第十一届11月蓝桥杯大赛软件类B组C/C++省赛题解
  13. WannaCry勒索病毒处理指南
  14. 【Web】一种好用的浏览器页面打印(打印销售小票)方法
  15. 开箱即用的流媒体管理系统wvp-GB28181-pro 基于ZLMediaKit
  16. Linux系统 推送Windows桌面应用更新
  17. java 将特殊字符以及中文转换浏览器可以识别的码
  18. 一元三次方程求解-二分
  19. Scilab 被抛弃的一些函数
  20. wordpress vue_使用Vue构建WordPress插件

热门文章

  1. 80核处理器_8核处理器+4K屏加持,首发6399元的联想YOGA 27一体机体验怎么样?
  2. Rust程序设计语言-使用包、Crate和模块管理不断增长的项目
  3. pycharm2019+破解补丁
  4. 产品读书《关键对话:如何高效能沟通》
  5. Fresco使用详情
  6. Curious Array
  7. 快乐的强化学习6——DDPG及其实现方法
  8. gan的几种变体_推荐系统系列第6部分,用于协作过滤的自动编码器的6种变体
  9. 【天池竞赛系列】菜鸟-需求预测与分仓规划初赛冠军解决方案
  10. 计算机无纸化考试题库,无纸化考试题库系统