APK的Native库使用Address Sanitizer分析内存异常访问(Android.bp)

官网文档介绍了如何使能Address Sanitizer和运行时控制它的行为

https://developer.android.google.cn/ndk/guides/asan?hl=zh-cn

https://source.android.google.cn/devices/tech/debug/asan?hl=zh_cn

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

本文接下来主要是对官网的补充:

1、Android.bp构建Native代码时如何使能Address Sanitizer功能

cc_library_shared {
name: "libnative_test",

cflags: [
    "-fno-omit-frame-pointer",
    "-O0",
],

sanitize: {
    address: true;//使能Address Sanitizer
    hwaddress: true;//使能HW Address Sanitizer
},
}

cflags增加"-fno-omit-frame-pointer"和"-O0"选项,为了让打印的栈信息更清晰

address和hwaddress字段不能一起使能,

2、AndroidManifest.xml中android:extractNativeLibs=true如果不配置采用默认值可能会出现APK安装失败

需要明确指定,否则选择不同的最小SDK版本导致将导致该默认值不一致具体详见的链接《关于android:extractNativeLibs的默认值

3、APK源码目录需要增加asan动态库,库完整名称是"libclang_rt.asan-aarch64-android.so",如果是hwasan则是"libclang_rt.hwasan-aarch64-android.so"

4、wrap.sh导致APK启动白屏

使用AndroidStuidio按照官网目录创建wrap.sh文件后,文件的格式是DOS格式,Android上运行的shell脚本必须是unix格式,需要进行格式转换否则APK启动失败,APK一直白屏。

https://github.com/google/sanitizers/issues/1023

5、wrap.sh的运行原理

zygote首先启动wrap.sh,wrap.sh配置环境变量一起其他启动APK前想做的其他处理然后启动APK。可以通过Wrap.sh修改ASAN_OPTIONS的值,控制Address Sanitizer的运行时。比如“ASAN_OPTIONS=detect_container_overflow=0,detect_odr_violation=0”;这里是关闭容器溢出访问和odr_violation检查。

6、异常输出

当Address Sanitizer检测到异常时,异常信息会输出到Logcat,TAG是“wrap.sh”。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值