HarmonyOS 鸿蒙Next中release模式下如何使用addr2line还原堆栈信息
HarmonyOS 鸿蒙Next中release模式下如何使用addr2line还原堆栈信息 在编译HarmonyOS的C++项目时,想发布应用前保存带调试信息的so,用来使用addr2line还原堆栈信息,release模式下so如何携带调试信息?
可以通过在模块下build-profile.json5中配置externalNativeOptions/arguments中添加配置-DCMAKE_BUILD_TYPE=RelWithDebInfo
。通过这个配置,缓存目录中的build/product/intermediates/libs/{target}/${arch}/
下的so,会携带调试信息。示例代码如下:
"buildOption": {
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "-DCMAKE_BUILD_TYPE=RelWithDebInfo",
"cppFlags": ""
}
}
在release模式下,打开debugSymbol的strip配置,会对最终打包的so执行strip,所以可以保证产物包中的so不携带调试信息,但是本地保留携带调试信息的版本。示例代码如下:
"buildOptionSet": [
{
"name": "release",
"nativeLib": {
"debugSymbol": {
"strip": true,
"exclude": []
}
}
}
]
【总结】
通过CMAKE_BUILD_TYPE及debugSymbol配置,可以保证最终产物hap/hsp/har中的so最小化,且在本地保存携带调试信息的so版本,来使用addr2line还原堆栈信息。
更多关于HarmonyOS 鸿蒙Next中release模式下如何使用addr2line还原堆栈信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next release模式下使用addr2line还原堆栈信息:
- 确保已获取:
- 带符号表的原始so文件
- 崩溃堆栈的地址信息
-
命令格式:
addr2line -e your_library.so -f -C 0x12345678
-
关键参数:
-e
指定带符号表的so文件-f
显示函数名-C
解码C++名称 地址需转换为so文件基址的偏移量
- 注意release版需保留符号表文件用于调试。
在HarmonyOS Next的release模式下保留调试信息以便使用addr2line分析堆栈,可以通过以下方式实现:
- 在BUILD.gn文件中添加调试符号配置:
executable("your_target") {
# ...其他配置
configs += [
"//build/ohos:release",
]
cflags = [ "-g" ] # 保留调试信息
ldflags = [ "-rdynamic" ] # 保留动态符号表
}
- 或者使用更精细的配置:
executable("your_target") {
# ...其他配置
if (is_release) {
cflags = [ "-g" ]
ldflags = [ "-rdynamic" ]
strip = false # 禁止strip调试符号
}
}
- 编译后可以通过以下命令验证是否包含调试信息:
readelf -S your_lib.so | grep debug
- 使用addr2line时:
addr2line -e your_lib.so -f -C <address>
注意:release模式保留调试信息会增加so文件大小,建议仅用于测试环境。