介绍Harmony符号表的基础概念,以及如何找到符号表并上传。
一、什么是符号表
1. SO 符号表
通常release的so会经过strip,strip后的so中的符号表、调试信息会被剥离。
对于鸿蒙Native Crash ,系统打印的堆栈无法看到代码行信息。
#00 pc 0000000000001a90 /data/storage/el1/bundle/libs/arm64/libnative_lib.so(ac31cd29c82e7fe217d52c64c299bb043881e400)
为了能快速准确帮用户定位Crash发生的代码位置,崩溃分析使用符号表对Crash堆栈进行解析还原。例如上面的堆栈还原之后:
CallCppCrash(napi_env__*, napi_callback_info__*) at(/src/main/cpp/napi_init.cpp:23)
2. Harmony 符号表(nameCache & sourceMaps 文件)
在构建Harmony HAP或者HAR包的时候,用户按照官方文档配置混淆,见ArtTS代码混淆。
在构建 Harmony HAP和HAR包的时候,开发IDE 使用 nameCache.json 和 sourceMaps.json 记录混淆前后的符号、变量、代码行号映射关系。
崩溃分析在解析ArkTS堆栈的时候会使用应用版本匹配的nameCache.json和sourceMaps.json,来进行符号化操作。
在上传符号表的时候,需要将nameCache.json和sourceMaps.json 打包成一个zip文件上传。
二、如何找到符号表
1. SO符号表位置
为了方便找回Crash对应的Debug SO文件并还原堆栈,每一次发布HAP包的时候,请备份好Debug SO。
带debug信息的so数据,产物位置:
{ProjectPath}/{ModuleName}/build/{product}/intermediates/libs
配置方式请参考release编译带debug信息的so。
2. nameCache & sourceMaps
为了方便找回Crash对应的符号表文件并还原堆栈,每一次发布HAP包的时候,请备份好对应的 nameCache 和 sourceMaps 文件。
nameCache.json
反混淆映射表,release模式编译产物,产物位置:
{ProjectPath}/{ModuleName}/build/{product}/cache/default/default@CompileArkTS/esmodule/release/obfuscation
sourceMaps.json
release模式编译产物,产物位置:
{ProjectPath}/{ModuleName}/build/{product}/cache/default/default@CompileArkTS/esmodule/release/sourceMaps.map
三、如何上传符号表
详见 网页上传符号表。
四、FAQ
详见 符号表 FAQ。