android 如何分析应用的内存(十二)——HWASan

这篇具有很好参考价值的文章主要介绍了android 如何分析应用的内存(十二)——HWASan。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android 如何分析应用的内存(十二)

上一篇介绍了ASan,这次介绍ASan的加强版HWASan

HWASan的使用

从NDK r21和Android 10 开始,Android支持HWAsan。HWAsan仅仅支持arm64架构的设备。

系统级准备

HWASan需要系统的支持,因此,需要重新编译系统镜像。可以是android模拟器,也可以是真机。
本次实验,选择了Pixel3的真机作为演示。同时使用了android-12.0.0_r34分支。

第一步:初始化repo

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

第二步:同步代码,如下:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r34
repo sync -j32

这里使用了清华镜像站。可以参考:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

第三步:下载设备相关的驱动,下载地址:https://developers.google.cn/android/drivers?hl=zh-cn

## 在aosp的根目录下创建一个vendor目录
mkdir vendor 
## 解压下载的文件
cd vendor
tar -xzvf ../google_devices-blueline-sp1a.210812.016.c2-47172864.tgz
## 运行解压之后的脚本
./extract-google_devices-blueline.sh

第四步:开始编译,并打开HWASan的编译开关

## 初始化环境
. build//envsetup.sh
## 选择编译的目标
lunch aosp_blueline-userdebug
## 打开HWASan开关
export SANITIZE_TARGET=hwaddress
## 开始编译
m -j32

注意:这里仅仅是为了演示,如果在开发中,可以参考,下面的链接,进行文件配置:https://cs.android.com/android/platform/superproject/+/master:device/google/coral/aosp_coral_hwasan.mk?hl=zh-cn

第五步:下载编译好的镜像到手机中

## 进入bootloader模式.或者长按电源键和音量下键进入bootloader模式
adb reboot bootloader 
## 使用fastboot 刷入
fastboot flashall -w

一切ok之后,手机重启,可检查手机是否是正常刷入。如下
android 如何分析应用的内存(十二)——HWASan,android  内存分析,hwasan,aosp编译,pixel3 编译源码,hwasan使用,hwasan解析

注意:如果出现:“No valid slot to boot” 错误。请执行第三步

系统级准备(非自我编译)

除了可以自己编译aosp的镜像以外,还可以使用已经编译好的镜像。访问如下网址https://flash.android.com/
然后允许“allow adb access”。

然后选择aosp_blueline_hwasan-userdebug即可。截图如下
android 如何分析应用的内存(十二)——HWASan,android  内存分析,hwasan,aosp编译,pixel3 编译源码,hwasan使用,hwasan解析

启用HWASan

同ASan一样,只需要改变编译选项即可。如下

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

或者在cmake中做如下配置

target_compile_options(test_malloc PUBLIC -fsanitize=hwaddress -g -O0 -fno-omit-frame-pointer)
set_target_properties(test_malloc PROPERTIES LINK_FLAGS -fsanitize=hwaddress )

他们和ASan的配置几乎一模一样。

注意-fsanitize后面的名字即可。

但是需要注意的是,在使用Cmakefile.txt时,需要在build.gradle文件中做如下配置

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL, but not c++_static.
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
}

为何要配置-DANDROID_STL=c++_shared

设置Android的STL为c++_shared。如果不设置,Android会使用默认的STL,这个默认的STL在编译的时候,通常不带有栈帧指针。

注意:如同ASan配置一样,HWASan也需要将相应的运行时库,放入项目中。它与ASan运行时库的位置相同。

测试

在测试代码中,加入如下的错误使用:

//分配一个int大小的空间
volatile int * pInt  = (volatile int *)malloc(sizeof(int));
//访问的时候,超出这个int大小的空间
*(pInt+6) = 12345;

则会看到如下的测试结果
android 如何分析应用的内存(十二)——HWASan,android  内存分析,hwasan,aosp编译,pixel3 编译源码,hwasan使用,hwasan解析

解析

从上面的log输出中,解析如下栈帧

 #0 0x7909126710  (/data/app/~~KRSuefEcZY9JtCH0m729KA==/com.example.test_malloc-NzWK4ADc7lagct58AY6Qnw==/lib/arm64/libtest_malloc.so+0x4710)

解析过程如下
android 如何分析应用的内存(十二)——HWASan,android  内存分析,hwasan,aosp编译,pixel3 编译源码,hwasan使用,hwasan解析
可以看到出现问题在native-lib.cpp的第219行15列

HWASan忽略错误,继续运行

在编译选项中加入-fsanitize-recover=hwaddress,在运行时选项中,加入halt_on_error=0
分别如下:
android 如何分析应用的内存(十二)——HWASan,android  内存分析,hwasan,aosp编译,pixel3 编译源码,hwasan使用,hwasan解析

android 如何分析应用的内存(十二)——HWASan,android  内存分析,hwasan,aosp编译,pixel3 编译源码,hwasan使用,hwasan解析

HWASan查看所有支持的选项

在运行时选项中,加入help=1.如下:

export HWASAN_OPTIONS=allow_user_segv_handler=1,halt_on_error=0,help=1

剩下的选项,和ASan类似,不再做过多的介绍,可参考上一篇文章:android 如何分析应用的内存(十一)——ASan

同上一篇文章一样,在做内存泄漏检测的时候,没有通过,所以没有列出,后续可能会补充。

诚然,这篇文章和上篇文章,已经脱离了内存分析的范围,转向了指针错误使用的范畴。但考虑到整个知识框架的完整性,也依然将其列出。后续若有读者能找到更好的资料,感谢分享~

至此,HWASan介绍完毕,本来这部分应该多写一点。多出来的内容应该在aosp的编译上面,但是考虑到这是介绍内存的文章,就不再过多介绍aosp的编译了,只是对需要用的编译过程做了描述。

下面是native的最后一个部分,perfetto的使用文章来源地址https://www.toymoban.com/news/detail-610675.html

到了这里,关于android 如何分析应用的内存(十二)——HWASan的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用

    在上一篇文章介绍了jdb调试java应用 接下来介绍用UI界面调试java应用,达到同jdb一样的效果。 同样的UI界面有很多选择,如Eclipse,Android Studio,Visual Studio Code.因为Android Studio的诸多不便,结合自身的使用习惯,这里推荐并介绍Visual Studio Code 安装必要的插件 在插件市场中,搜索

    2024年02月14日
    浏览(51)
  • android 如何分析应用的内存(十七)——使用MAT查看Android堆

    前一篇文章,介绍了使用Android profiler中的memory profiler来查看Android的堆情况。 如Android 堆中有哪些对象,这些对象的引用情况是什么样子的。 可是我们依然面临一个比较严峻的挑战:不管是app开发者,还是内存分析者而言,堆中的对象,非常之多,不仅有Android 原生的类,还

    2024年02月13日
    浏览(69)
  • android 如何分析应用的内存(八)——Android 7.0以后的malloc debug

    接上文,介绍六大板块中的第三个————malloc调试和libc回调 上一篇文章中,仅仅是在分配和释放的时候,拦截对应的操作。而不能进一步的去检查内存问题。比如:释放之后再次使用指针,内存泄漏,内存损坏等等。 在这篇文章中,将会介绍malloc调试技术,它可以对nat

    2024年02月10日
    浏览(43)
  • Android平台HWASan使用介绍

    Hardware Address Sanitizer (HWASan)是应在开发期间使用的内存 bug 检测工具。对于 arm64,建议使用 HWASan;对于 32 位 arm 和非 Arm 平台,建议使用 ASan。两者提供的功能相同,并且都应当用于检测用户空间代码中的内存安全 bug。 在Android系统编译时加入如下配置: 在Rockchip的Android11及以

    2024年02月14日
    浏览(52)
  • ASan和HWAsan在Android中使用

    ASan HWASan 全称 Address Sanitizer Hardware-assisted AddressSanitizer 版本 可以在32位和64位的x86、x86-64上。 从API 27(Android O MR 1)开始,Android NDK 可支持ASAN。 在Android 11 之后的AOSP master中,弃用了arm64 上的平台开发ASan,改为使用HWASan。 只在Android 10 及以上版本有效,且只使用于AArch64硬件平台

    2024年02月15日
    浏览(28)
  • 如何使用KoodousFinder搜索和分析Android应用程序中的安全威胁

    KoodousFinder是一款功能强大的Android应用程序安全工具,在该工具的帮助下,广大研究人员可以轻松对目标Android应用程序执行安全研究和分析任务,并寻找出目标应用程序中潜在的安全威胁和安全漏洞。 在使用该工具之前,我们首选需要访问该工具的【开发者门户】创建一个

    2024年02月13日
    浏览(61)
  • Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

    1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置 jvm heap 默认384m , 如下图所示: 当app 进程中java 层 new 对象(加起来总和)占用的堆内存达到jvm heap 峰值时,就会抛出OOM 。

    2024年02月14日
    浏览(47)
  • Android Profiler 内存分析器使用

    Android Profiler是Android Studio的一部分,提供了一个集成的性能分析工具套件,包括内存分析。Android Profiler 工具可提供实时数据,帮助您了解应用的 CPU、内存、网络和电池资源使用情况。 在Android Profiler中,您可以查看内存使用情况的实时图表、堆转储快照、分析内存泄漏等,

    2024年02月08日
    浏览(49)
  • Android内存泄漏分析及检测工具LeakCanary简介,Android进阶

    @Synchronized override fun expectWeaklyReachable( watchedObject: Any, description: String ) { if (!isEnabled()) { return } removeWeaklyReachableObjects() val key = UUID.randomUUID() .toString() val watchUptimeMillis = clock.uptimeMillis() val reference = KeyedWeakReference(watchedObject, key, description, watchUptimeMillis, queue) SharkLog.d { \\\"Watching \\\" +

    2024年04月25日
    浏览(39)
  • Android 内存泄漏、性能分析常用工具

    一、内存泄漏 1、 MAT-eclipse :“Memory Analyzer Tool”,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。 2、Leakcanary :一款开源的自动检测内存泄漏的工具。 3、AndroidStudio Profiler :Android Studio 3.0 采用全新

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包