开发者手机4.0/4.1release版本asan版本编译及测试
1、修改appfreeze 检测时间 路径:foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_service.h 修改原因:避免应用启动超时被杀;asan 版本挂测应用的时候会导致应用非常卡顿,容易导致dfx 故障检测误报。 //在原有
1、修改appfreeze 检测时间
路径:foundation\ability\ability_runtime\services\abilitymgr\include\ability_manager_service.h
修改原因:避免应用启动超时被杀;asan 版本挂测应用的时候会导致应用非常卡顿,容易导致dfx 故障检测误报。
//在原有的数值后面添加了3个0
#ifdef SUPPORT_ASAN
static constexpr uint32_t LOAD_TIMEOUT = 150000000; // ms
static constexpr uint32_t ACTIVE_TIMEOUT = 75000000; // ms
static constexpr uint32_t INACTIVE_TIMEOUT = 7500000;
2、编译报错相关修改:
2.1、hiebpf编译报错修改:
修改前编译报错内容如下:
[OHOS ERROR] [2294/40456] CC obj/developtools/profiler/hiebpf/src/hiebpf.bpf/hiebpf.bpf.o
[OHOS ERROR] FAILED: obj/developtools/profiler/hiebpf/src/hiebpf.bpf/hiebpf.bpf.o
[OHOS ERROR] /usr/bin/ccache ../../prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang -MMD ......
obj/developtools/profiler/hiebpf/src/hiebpf.bpf/hiebpf.bpf.o
[OHOS ERROR] clang: error: unsupported option '-fsanitize=address' for target 'bpf'
[OHOS ERROR] Traceback (most recent call last):
修改方法:
路径 \developtools\profiler\bundle.json 中删除 "//developtools/profiler/hiebpf:hiebpf_tool", 行
2.2、so添加白名单:
路径:developtools\integration_verification\tools\deps_guard\rules\ChipsetSDK\whitelist.json 中添加"libasound.so", "libinit_stub_empty.so",
// chipset modules can be depended by system directly
"libosalbase.z.so",
"libmetadata.z.so",
"libasound.so",
"libdisplay_device.z.so",
"libdisplay_layer.z.so",
"libinit_stub_empty.so",
"libdispdev.z.so",
"libproperty.z.so",
"libhril_innerkits_ext.z.so",
"libhdi_input.z.so",
2.3、修改netmanager_base目录下的gn文件,去除-fsanitize=cfi相关参数
修改前报错:
修改方法:对此4.1release 版本中对应的文件修改,该编译参数相关的内容
文件路径:
foundation/communication/netmanager_base/interfaces/innerkits/netconnclient/BUILD.gn
foundation/communication/netmanager_base/interfaces/innerkits/netmanagernative/BUILD.gn
foundation/communication/netmanager_base/interfaces/innerkits/netstatsclient/BUILD.gn
foundation/communication/netmanager_base/interfaces/innerkits/netpolicyclient/BUILD.gn
foundation/communication/netmanager_base/test/fuzztest/netconnclient_fuzzer/BUILD.gn
foundation/communication/netmanager_base/test/fuzztest/netpolicyclient_fuzzer/BUILD.gn
foundation/communication/netmanager_base/test/fuzztest/netstatsclient_fuzzer/BUILD.gn
foundation/communication/netmanager_base/test/fuzztest/netsysclient_fuzzer/BUILD.gn
说明:4.1release 版本不用修改。
3、调整system.img 和vendor.img 分区大小
路径:build\ohos\images\mkimage\system_image_conf.txt
/
2910612224
--fs_type=ext4
--dac_config ../../build/ohos/images/mkimage/dac.txt
路径:build\ohos\images\mkimage\vendor_image_conf.txt
/vendor
468434944
--fs_type=ext4
--dac_config ../../build/ohos/images/mkimage/dac.txt
--file_context obj/base/security/selinux_adapter/file_contexts.bin
说明:rk3568 和3588 需要修改烧录分区的大小和开始地址,否者会出现烧录失败的情况,具体大小在烧录日志中可以查到
路径:\device\board\hihope\dayu210\loader\parameter.txt
CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00001000@0x00006000(bootctrl),0x00003000@0x00007000(resource),0x00030000@0x0000A000(boot_linux:bootable),0x00002000@0x0003A000(ramdisk),0x00570000@0x0003C000(system),0x00200000@0x005AC000(vendor),0x00019000@0x007AB000(sys-prod),0x00019000@0x007C4000(chip-prod),0x0000a000@0x007DE000(updater),0x00400000@0x007E7000(userdata:grow)
4、编译脚本修改
路劲:\build\common\asan\build_mixed_asan.sh
添加--gn-args asan_detector=true 参数
# build both asan and nonasan images
start_time=$(date +%s)
cd "${TOPDIR}"
if [ -d out.a ]; then
if [ -d out ]; then
mv out out.n
fi
mv out.a out
fi
${no_build+echo skip} ./build.sh "$@" --gn-args is_asan=true --gn-args asan_detector=true --gn-args use_thin_lto=false --gn-args ohos_extra_cppflags="-fno-lto" --keep-ninja-going --gn-args ohos_extra_cxxflags="-fno-whole-program-vtables" --gn-args ohos_extra_cflags="-fno-whole-program-vtables"
step1_time=$(date +%s)
mv out out.a
if [ -d out.n ]; then
mv out.n out
fi
${no_build+echo skip} ./build.sh "$@" --gn-args is_asan=false --gn-args asan_detector=true
step2_time=$(date +%s)
说明:4.0release 版本需要上述修改,4.1release 已经自带上述参数,无需修改。
5、全量服务编译指令:
./build/common/asan/build_mixed_asan.sh --product-name XXXX--ccache --no-prebuilt-sdk --build-variant root --target-cpu arm64 --no-data-asan
说明:XXXX:为产品名称,需修改为对应版本的产品名称,--target-cpu arm64 为编译64位版本,可以根据实际情况添加。
6、烧录:
导入out/xxxx/packages/phone/image 目录下的pac包,然后在烧录工具中将system.img和vender.img 替换为该目录下的img 后烧录
说明:开发者手机烧录包为pac格式,需要替换system和vender或者修改打包pac的脚本,rk3568和rk3588 按正常的烧录就可以。
7、设置开启asan的应用或者服务
7.1、创建压测应用和服务配置文件
新建 sanitizerd.para 文件,在该文件中配置开启asan压测的应用或者服务,并推送到设备/etc/param/ 目录下
wrap.com.ohos.photos=asan_wrapper // com.ohos.photos 为应用的进程名
wrap.hilogd=asan_wrapper // hilogd 为系统服务的进程名
说明:该配置文件中可以配置多个应用和服务,但是配置太多后,系统压力大,会出现无法开机的情况,需要根据系统承受能力配置
7.2、创建asan.options 配置文件:
新建 asan.options文件,在该文件中添加asan配置参数,并推送到设备/etc/ 目录下覆盖原有配置文件
quarantine_size_mb=64
max_redzone=2048
thread_local_quarantine_size_kb=256
allow_user_segv_handler=1
detect_odr_violation=0
alloc_dealloc_mismatch=0
allocator_may_return_null=1
detect_container_overflow=0
abort_on_error=0
halt_on_error=0
allow_addr2line=1
report_globals=0
handle_abort=0
allow_user_poisoning=0
log_exe_name=true
handle_segv=0
detect_stack_use_after_return=0
print_module_map=5
7.3 重启设备然后确认配置的应用或者服务是否加载的asan目录下的so
打开应用或者拉起服务,查询进程号:指令ps -ef | grep xxxx ,然后cat /proc/进程号/maps |grep asan ,查询是否加载的/system/asan/目录下的so,如果是说明版本编译和设置都成功,可以压测复现问题。
8、asan故障日志反编译
故障日志:
反编译工具:路径:./prebuilts/clang/ohos/windows-x86_64/llvm/bin/llvm-addr2line.exe
反编译指令:llvm-addr2line.exe -Cfpie libnative_appdatafwk.z.so 0x7174
说明:将待符号表的libnative_appdatafwk.z.so 和工具 libnative_appdatafwk.z.so 放在同一个目录下,0x7174 为堆栈后面+0x7174
D:\oriole\asan_0507\unstripped\asan>llvm-addr2line.exe -Cfpie libnative_appdatafwk.z.so 0x7174
OHOS::AppDataFwk::SharedBlock::Alloc(unsigned long) at /home/yxq/daily/weekly/kasan_asan/oriole_asan-202405071427/out/oriole/../../foundation/distributeddatamgr/relational_store/frameworks/native/appdatafwk/src/shared_block.cpp:223
(inlined by) OHOS::AppDataFwk::SharedBlock::AllocRow() at /home/yxq/daily/weekly/kasan_asan/oriole_asan-202405071427/out/oriole/../../foundation/distributeddatamgr/relational_store/frameworks/native/appdatafwk/src/shared_block.cpp:197
通过反编译就可以确定出问题的代码具体位置,然后再根据日志和代码分析解决问题。
更多推荐
所有评论(0)