ASAN概述

ASAN(Address Sanitizer)是针对 C/C++ 的快速内存错误检测工具,在运行时检测 C/C++ 代码中的多种内存错误。
下面以社区OpenHarmony_3.2Release_标准系统、rk3568产品为例说明OpenHarmony_ASAN版本编译及使用

OpenHarmony_ASAN版本编译

编译脚本:

build_mixed_asan.sh 位于源码build/common/asan/目录下。该脚本支持--gn-args is_asan=true或者-gN:xxx,yyy,...参数,该脚本可以在编译阶段直接生成包含正常版本和asan版本的系统镜像。

编译步骤:

1)、配置开发环境并下载社区全量代码
详细方法:https://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/quick-start/quickstart-pkg-prepare.md/
2)、编译正常版本镜像,验证源码和编译环境均已准备就绪
在源码根目录下执行指令:./build.sh --product-name rk3568 --ccache
出现 =====build successful===== 则说明编译成功。
3)、使用--gn-args is_asan=true参数编译系统默认ASAN版本镜像。
在源码根目录下执行指令:./build/common/asan/build_mixed_asan.sh --product-name rk3568 --ccache --build-variant root --gn-args is_asan=true
编译成功后在 源代码根目录/out/rk3568/packages/phone/images 目录下出现如下几个镜像

其中systemX.img镜像对应的含义如下

镜像包说明
system.img正常版本镜像,不包含开启asan检测的服务
system2.imgASAN版本镜像,开启appspawn服务的内存检测
system5.imgASAN版本镜像,开启foundation、graphic、distributed_data服务的内存检测
system0.imgASAN版本镜像,开启 ui_service,samgr_standard,screenlockservice,timeservice,batterystats,bgtaskmgr_service,console,device_usage_statistics_service,audio_policy,pulseaudio,multimodalinput,pasteboardservice,inputmethodservice,telephony,misc,graphic,distributed_data,resource_schedule_service,deviceauth_service,deviceinfoservice,dhardware,distributedbms,distributedfile,distributedsched,dscreen,dslm_service,token_sync,useriam,accountmgr,dcamera,bluetooth_service,downloadservice,installs,locationsa,memmgrservice,storage_daemon,storage_manager,thermal,thermal_protector,privacy,accessibility,access_token,hidumper_service,camera_service,sensors_musl,bytrace,edm,faultloggerd,fms_service,hilogd,hitrace,hiview,huks_service,msdp_musl,netmanager_base,netsysnative,param_watcher,pinauth_sa_profile,watchdog服务的内存检测
systemF.imgASAN版本镜像,开启全部服务的内存检测

4)、使用-gN:xxx,yyy,...参数编译自定义检测服务的ASAN版本镜像
例如:编译开启camera_service服务内存检测的ASAN镜像,镜像序号为7
在源码根目录下执行指令:./build/common/asan/build_mixed_asan.sh --product-name rk3568 --ccache --build-variant root -g7:camera_service
编译成功后在源代码根目录/out/rk3568/packages/phone/images 目录下出现系统镜像system7.img
注意:
1.-g后的数字范围:0-9,之后是服务名,可去设备的/system/etc/init/路径下查看你想要的服务。
2.-g后的数字和服务没有什么对应关系,一个数字可以对应多个服务,数字在允许的范围内设置即可。需要注意的是,数字是生成的镜像名(如system7.img)
3.ASAN版本系统在使用过程中占用系统的内存大概是正常版本的2-3倍,对于硬件资源比较紧张的设备,需控制开启检测服务的数量,否者会造成系统卡顿甚至无法开机的情况。

OpenHarmony_ASAN版本烧录

ASAN版本烧录步骤和标准版本一样,唯一区别在于选择system.img镜像的时候,选择开启asan版本的镜像,如编译示例中的system2.img或者system0.img或者system7.img,烧录完成后重启设备即可进行后续的压测。

OpenHarmony_ASAN版本使用

1)压测:

ASAN版本压测根据用户的需求进行:
1、使用常见的稳定性测试场景测试:如系统遍历,单应用遍历,休眠唤醒,开关机等,大范围的测试系统服务是否存在内存问题。
2、因内存问题导致的cppcrash故障,确定问题场景后,使用asan版本镜像在该场景下复现该问题。

2)获取故障日志:

ASAN故障日志在设备中/data/log/sanitizer/asan/目录下,如:asan.log.01 ,需手动去设备中查看导出。

3)故障日志反编译:

将上述故障日志asan.log.01导出设备并复制到源码目录/out/rk3568/packages/phone/images中,在该目录下执行.resolve_asan_log.sh asan.log.01指令后会在该目录下会生成asan.log.01.resolved文件,后续就可以根据asan.log.01.resolved文件中的调用栈分析具体的内存问题啦!
如:

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐