Address Sanitizer

注意:本文档将介绍如何在 Address Sanitizer 下运行使用 NDK 构建的 Android 应用。如需了解如何对 Android 平台组件使用 Address Sanitizer,请参阅 AOSP 文档。

从 API 级别 27 (Android O MR 1) 开始,Android NDK 可支持 Address Sanitizer(也称为 ASan)。

ASan 是一种基于编译器的快速检测工具,用于检测原生代码中的内存错误。ASan 可以检测以下问题:

  • 堆栈和堆缓冲区上溢/下溢
  • 释放之后的堆使用情况
  • 超出范围的堆栈使用情况
  • 重复释放/错误释放

ASan 可在 32 位和 64 位 ARM 以及 x86 和 x86-64 上运行。ASan 的 CPU 开销约为 2 倍,代码大小开销在 50% 到 2 倍之间,并且内存开销很大(具体取决于您的分配模式,但约为 2 倍)。

对于 64 位 ARM,强烈建议使用 HWAddress Sanitizer。

构建

如需使用 Address Sanitizer 构建应用的原生 (JNI) 代码,请执行以下操作:

ndk-buildCMake

在 Application.mk 中:

APP_STL := c++_shared # Or system, or none.
APP_CFLAGS := -fsanitize=address -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=address

对于 Android.mk 中的每个模块:

LOCAL_ARM_MODE := arm

注意:在使用 libc++_static 时,ASan 目前不兼容 C++ 异常处理。使用 libc++_shared 或不使用异常处理的应用或者不受影响,或者有相应解决方法。如需了解详情,请参阅问题 988。

运行

从 Android O MR1(API 级别 27)开始,应用可以提供可封装或替换应用进程的封装 Shell 脚本。这样一来,可调试的应用就可对其应用启动过程进行自定义,以便在生产设备上使用 ASan。

注意:以下说明将介绍如何将 ASan 与 Android Studio 项目结合使用。对于非 Android Studio 项目,请参阅封装 Shell 脚本文档。

  1. 将 android:debuggable 添加到应用清单中。
  2. 在应用的 build.gradle 文件中将 useLegacyPackaging 设置为 true。如需了解详情,请参阅封装 Shell 脚本指南。
  3. 将 ASan 运行时库添加到应用模块的 jniLibs 中。
  4. 将包含以下内容的 wrap.sh 文件添加到 src/main/resources/lib 目录中的每个目录。

    #!/system/bin/sh
    HERE="$(cd "$(dirname "$0")" && pwd)"
    export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1
    ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so)
    if [ -f "$HERE/libc++_shared.so" ]; then# Workaround for https://github.com/android-ndk/ndk/issues/988.export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so"
    elseexport LD_PRELOAD="$ASAN_LIB"
    fi
    "$@"
    

注意:NDK 在此处提供了适用于 ASan 的推荐 wrap.sh 文件。

假设您项目的应用模块的名称为 app,您的最终目录结构应包含以下内容:

<project root>
└── app└── src└── main├── jniLibs│   ├── arm64-v8a│   │   └── libclang_rt.asan-aarch64-android.so│   ├── armeabi-v7a│   │   └── libclang_rt.asan-arm-android.so│   ├── x86│   │   └── libclang_rt.asan-i686-android.so│   └── x86_64│       └── libclang_rt.asan-x86_64-android.so└── resources└── lib├── arm64-v8a│   └── wrap.sh├── armeabi-v7a│   └── wrap.sh├── x86│   └── wrap.sh└── x86_64└── wrap.sh

堆栈轨迹

Address Sanitizer 需要在每次调用 malloc/realloc/free 时都展开堆栈。这里介绍两个选项:

  1. 基于帧指针的“快速”展开程序。请按照构建部分中的说明使用此展开程序。

  2. “慢速”CFI 展开程序。在此模式下,ASan 会使用 _Unwind_Backtrace。它只需要使用 -funwind-tables(通常默认处于启用状态)。

    注意:“慢速”展开程序速度缓慢(速度差距达 10 倍或更多,具体取决于您调用 malloc/free 的频率)。

快速展开程序是 malloc/realloc/free 的默认选项。慢速展开程序是严重异常所对应堆栈轨迹的默认选项。通过将 fast_unwind_on_malloc=0 添加到 wrap.sh 的 ASAN_OPTIONS 变量中,即可为所有堆栈轨迹启用慢速展开程序。

Address Sanitizer相关推荐

  1. linux libasan.so,Address Sanitizer 用法

    Address Sanitizer(ASan)是一个快速的内存错误检测工具.这里说明它的用法. 参考资料 1. 简介 Address Sanitizer(ASan)是一个快速的内存错误检测工具.它非常 ...

  2. Address Sanitizer 用法

    Address Sanitizer(ASan)是一个快速的内存错误检测工具.这里说明它的用法. 参考资料 AddressSanitizer https://github.com/google/sani ...

  3. LINUX 下使用Address Sanitizer ,以及不能运行的问题

    文章目录 一. 简介 二.AddressSanitizer 的使用 使用方法 1.使用添加编译选项的方式使用ASan 2.使用CMake添加编译选项 三.测试 不添加Asan选项,不会有任何输出 添加 ...

  4. Address Sanitizer定位内存问题

    Address Sanitizer(ASan)是一个快速的内存错误检测工具.这里说明它的用法. 参考资料 AddressSanitizer https://github.com/google/sani ...

  5. Android稳定性系列-01-使用 Address Sanitizer检测原生代码中的内存错误

    前言 想必大家曾经被各种Native Crash折磨过,本地测试没啥问题,一到线上或者自动化测试就出现各种SIGSEGV.SIGABRT.SIGILL.SIGBUS.SIGFPE异常,而且堆栈还是崩溃 ...

  6. Android NDK Address Sanitizer

    文章目录 构建 运行 堆栈轨迹 二进制测试 此文章是基于官方文档 Address Sanitizer的基础上做了一些扩展说明. 从 API 级别 27 (Android O MR 1) 开始,Andr ...

  7. Address Sanitizer使用指南

    文章目录 前言 一.Address Sanitizer简介 二.使用步骤 1.安装gcc7.5.0 2.编译程序 3.设置运行环境 4.运行程序 5.分析内存检测报告 前言 使用C/C++编程,不可避 ...

  8. Sanitizers 系列之 address sanitizer 用法篇

    入门例子 二分查找算法是非常经典的算法,它看似简单,但是写出一个完全正确的二分查找算法还是比较考验工程师的算法功力的,下面是在网上流传的一个版本,请读者思考:这个程序正确吗? #include < ...

  9. address sanitizer memcpy param overlap

    刷leetcode时报的错,翻译过来是地址管理memcpy参数重叠,看了半天没找到解决方案 然后发现是创建string变量的时候写成了string str=str.substr(i,sub_lengt ...

最新文章

  1. 华为DUA-AL00真机android studio识别不出
  2. python如何创建模块教程_Python创建模块及模块导入的方法
  3. 工控设备 如何将数据发送到串口_AB PLC和西门子PLC之间需要交换数据
  4. Java学习小程序(2)输出三个数中的最大值
  5. 第一次自己成功写成的js程序
  6. 智能优化算法:风驱动优化算法-附代码
  7. 从零开始研发GPS接收机连载——4、GPS模拟器数据采集验证
  8. 史上最全Plastic SCM - Unity版本控制工具使用经验分享
  9. Twaver-HTML5基础学习(24)快速查找(QuickFinder)
  10. codeforces 592D(树DP)
  11. php ios表情包,php 处理APP emoji表情包 IOS表情包 Mysql保存手机表情
  12. python求周长_计算任何三角形的周长[python 3]
  13. 计算机体系结构:系统平均无故障时间(MTTF)计算例题
  14. Nevron 3DChart创建有吸引力的3D和2D图表
  15. 小米手机权限开启方法9
  16. 探索式测试之隐喻(种植)
  17. 期许2016 迎新春技术分享沙龙总结
  18. 车载以太网之SomeIP协议
  19. 基于SPI的OLED显示
  20. DICOM医学图像处理:BMP转DCM、DCM转BMP、多张BMP转DCM、JPG转DCM,,多张JPG转DCM。

热门文章

  1. CSS中a标签“爱恨原则”
  2. FPGA量子类比机制-FPQA,将在量子运算设计中引发一场新的革命
  3. 微信小程序 - 【完整源码】实现微信拆红包动画效果,仿微信红包打开时的旋转分离动画功能示例(详细示例源码及注释,一键复制开箱即用)!
  4. Cisco(2)——ping通用交换机连接的两台PC机
  5. How to manage sudo users in Centos
  6. 如何使用163的SMTP服务发邮件?
  7. 论售前工程师主要岗位职责及作用
  8. VMware安装Ubuntu 16.04(完整版图文教程)
  9. 【python】py课后作业程序题5「PTA」
  10. Matlab文字球之长安十二时辰