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

news2024/11/28 4:42:48

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之后,手机重启,可检查手机是否是正常刷入。如下
在这里插入图片描述

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

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

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

然后选择aosp_blueline_hwasan-userdebug即可。截图如下
在这里插入图片描述

启用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;

则会看到如下的测试结果
在这里插入图片描述

解析

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

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

解析过程如下
在这里插入图片描述
可以看到出现问题在native-lib.cpp的第219行15列

HWASan忽略错误,继续运行

在编译选项中加入-fsanitize-recover=hwaddress,在运行时选项中,加入halt_on_error=0
分别如下:
在这里插入图片描述

在这里插入图片描述

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的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++] C++入门第二篇 -- 引用 -- 内联函数inline -- auto+for

目录 1、引用 -- & 1.1 引用的概念 1.2 引用特性 1.3 常引用 -- 权限问题 1.4 引用的使用场景 1.4.1 做参数 1.4.2 做返回值 注意 1.5 传值、传引用的效率比较 1.6 引用和指针的区别 2、内联函数 2.1 概念 转存失败重新上传取消​编辑转存失败重新上传取消​编…

“内卷之王”雪糕品牌,夏日营销如何花式出招?小红书数据分析!

酷夏已至,冰淇淋行业号称营销“内卷之王”,品牌们开始各显身手,掀起2023年的夏日冰淇淋大战。今年出现了哪些新的内容趋势?雪糕行业有哪些品牌营销趋势值得关注?笔者将通过小红书数据分析与内容洞察,带你一…

字典序排数(力扣)思维 JAVA

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9] 示例 2: 输入:n 2 输…

CNNdebug尝试

这算是啥问题?? 接着根据群里大佬提供的指示,将train和validate中的nums_work改成0即可 此处因为数据已经打乱了,所以在这里就不用打乱数据,把shuffle True修改成为False 后面查看指定目录下,竟然没有这个…

HPC集群调度系统和计算系统

什么是计算云? 所谓的计算云指的是为计算业务优化的类云基础架构,它强调用云的方式解决计算问题,而不是将“计算”搬到现有的公有云或者容器云上。 目前公有云或者容器云(例如k8s)上的HPC解决方案本质上都是将现有的H…

postgres wal2json插件jsonb字段数据丢失问题解决

使用pgwal2jsondebezium进行数据同步时,发现偶尔会有jsonb字段数据丢失的问题 进行测试时发现: 1、发生数据丢失的jsonb字段长度都比较大(超过toast阈值,使用toast表存储) 2、针对发生jsonb字段丢失的数据,jsonb字段本身未发生修…

3 Linux基础篇-VMware和Linux的安装

3 Linux基础篇-VMware和Linux的安装 文章目录 3 Linux基础篇-VMware和Linux的安装3.1 安装VMware和CentOS3.1.1 VM安装3.1.2 Centos7.6的安装步骤 3.3 虚拟机基本操作3.4 安装VMtools3.5 设置共享文件夹 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能…

【Java】Java多线程编程基础

文章目录 1. 进程与线程1.1 进程与线程的基本认识1.1.1 进程(Process)1.1.2 线程(Thread) 1.2 为什么会有线程1.2.1 以看视频为例 2. 多线程实现2.1 Thread类实现多线程2.2 Runnable接口实现多线程2.3 Callable接口实现多线程2.3 …

C++笔记之使用普通指针和shared_ptr在堆上申请类对象的各种写法

C笔记之使用普通指针和shared_ptr在堆上申请类对象的各种写法 code review! 文章目录 C笔记之使用普通指针和shared_ptr在堆上申请类对象的各种写法1.几种不同的写法2.ChatGpt回答 1.几种不同的写法 注:使用普通指针申请堆内存,其实是应该有delete的&…

站在读者角度:10个技巧写出有价值的文章

站在读者的角度,以下是10个写出有价值的文章的技巧: 1.确定你的目标读者:在开始写作之前,确定你的目标读者是谁,这有助于你更好地针对他们的需求和兴趣来写作。 2.了解你的读者:通过调查、研究和互动&…

OA系统构建排座

目录 一.排座的介绍,作用 1.排座介绍 A.前端实现 B.数据库实现 C.后端实现 2.排座作用 A.座位预订 B.座位安排 C. 实时座位状态显示 二.利用Layui实现排座 1.基础版(通过htmlcssjs实现) A.基础版源码(html): 2.进阶版 …

flex盒子 center排布,有滚动条时,拖动滚动条无法完整显示内容

文章目录 问题示例代码解决问题改进后的效果 问题 最近在开发项目的过程中,发现了一个有趣的事情,与flex盒子有关,不知道算不算是一个bug,不过对于开发者来说,确实有些不方便,感兴趣的同学不妨也去试试。 …

算法通关村第一关-链表黄金挑战笔记|环的入口

解决链表环入口问题 文章目录 解决链表环入口问题前言链表中环的问题Hash和集合的解法:快慢指针实现解决: 解题思路:Hash或者使用集合的方式实现快慢指针(这里使用三次刚好解决) 总结 前言 提示:无论今天过…

AI绘画Stable Diffusion原理之Autoencoder-Latent

前言 传送门: stable diffusion:Git|论文 stable-diffusion-webui:Git Google Colab Notebook:Git kaggle Notebook:Git 今年AIGC实在是太火了,让人大呼许多职业即将消失,比如既能帮…

Windows 10 安装 PostgreSQL教程

前言 本文写于2023年7月26日,经过本人实测,目前安装PostgreSQL 15.3版本有很多问题,百度测试过解决方法,暂无成功。因此建议安装低一点的版本。如PostgreSQL 14.8版本。以下记录我的安装过程,供大家参考。 下载地址 …

Ceph版本

每个Ceph的版本都有一个英文的名称和一个数字形式的版本编号 第一个 Ceph 版本编号是 0.1,发布于2008 年 1月。之后是0.2,0.3....多年来,版本号方案一直没变。 2015年 4月0.94.1 (Hammer 的第一个修正版) 发布后,为了避免 0.99 (以及 0.100…

Linux Day02

目录 一、Linux系统文件类型与文件权限 1、文件类型 3.修改文件权限---chmod 1.文字设定 二、Linux常用命令 1、基础命令 1.1 pwd 1.2 cd 1.3 ls 1.4 touch 1.5 mkdir 1.6 rmdir ​1.7 rm -r 1.8 cp 1.9 mv 2、文件查看命令 2.1 cat 2.2 more 2.3 less 2.4 hea…

【MySQL】不允许你不知道如何插入数据

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正&#xff0…

Python numpy库的应用、matplotlib绘图、opencv的应用

numpy import numpy as npl1 [1, 2, 3, 4, 5]# array():将列表同构成一个numpy的数组 l2 np.array(l1) print(type(l2)) print(l2) # ndim : 返回数组的轴数(维度数) # shape:返回数组的形状,用元组表示;元组的元素…

Redis数据库的9种数据类型与数据持久化

系列文章传送门: 【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 【七天入门数据库】第四天 数据操作语言DML 一、Redis的9种数据类型的基本操作 (一)k…