深入浅出Android NDK之ASan检测内存越界

Address Sanitizer简称Asan,是Android提供的用于检测内存错误的一个工具,基本的使用方法在官方文档中基本上已经写得很清楚了,我就不再啰嗦了,本文主要说一下在使用过程中的注意事项。

在阅读本文之前请先参考官方文档:
https://developer.android.google.cn/ndk/guides/asan?hl=zh_cn
https://github.com/google/sanitizers/wiki/AddressSanitizer

根据官方文档,大概分为以下三步:
1.修改Application.mk和Android.mk,并将libclang_rt.asan-xxx-android.so放入jniLibs对应的目录下,这一步最重要,主要是为了让我们自己的代码链接上asan的lib库。
2.C++运时时库要使用动态库,不能使用静态库。
3.将android:debuggable添加到清单文件中,这一步主要是为了指定apk是可调试的,但是这个一般不用管,因为现在的Android studio在编译debug包时,会默认帮你加上这个标志。
4.将wrap.sh 文件添加到 src/main/resources/lib,经测试这一步并不重要,有没有这个wrap.sh都可以,并且wrap.sh也不一定非要放在resource目录下,直接和SO库放在同一个目录就可以。

如果是使用ndk-build命令手动来编译我们的SO,还要注意在编译我们的代码的时候一定要关闭编译器优化,否则一个内存错误也检测不出来。
有以下三种方式关闭编译器优化:
1.在使用ndk-build编译时要加上NDK_DEBUG=1参数,即ndk-build NDK_DEBUG=1
2.Application.mk中加入APP_CFLAGS += -O0
3.Android.mk中加入LOCAL_CFLAGS := -O0
以上三种方式任选一种都可以。
如果你是使用android studio直接编译运行,那么一般不用关心这个问题,因为在编译debug包的时候,android studio会自动加上NDK_DBEUG=1标志,只要保证你没有在Android.mk或者Application.mk中将编译器优化选项显示指定过除了-O0以外的优化选项就可以(比如-O2)。
编译选项的优先级如下:Android.mk优先于Application.mk优先于ndk-build。

如果是使用ndk-build命令手动编译,编译完成后在libs目录下会自动生成libclang_rt.asan-xxx-android.so和wrap.sh。但如果是使用android studio来运行,这两个文件需要你手动从ndk安装目录拷贝过来。
最重要的是把libclang_rt.asan-xxx-android.so拷贝过来,上面说过经过测试wrap.sh这个文件并不那么重要。

我在github上上传了一个具体的例子:
https://github.com/htaohongtao/AsanTest
例子运行效果如下:
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值