HarmonyOS 鸿蒙Next中release模式下如何使用addr2line还原堆栈信息

HarmonyOS 鸿蒙Next中release模式下如何使用addr2line还原堆栈信息 在编译HarmonyOS的C++项目时,想发布应用前保存带调试信息的so,用来使用addr2line还原堆栈信息,release模式下so如何携带调试信息?

3 回复

可以通过在模块下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还原堆栈信息:

  1. 确保已获取:
  • 带符号表的原始so文件
  • 崩溃堆栈的地址信息
  1. 命令格式: addr2line -e your_library.so -f -C 0x12345678

  2. 关键参数:

  • -e 指定带符号表的so文件
  • -f 显示函数名
  • -C 解码C++名称 地址需转换为so文件基址的偏移量
  1. 注意release版需保留符号表文件用于调试。

在HarmonyOS Next的release模式下保留调试信息以便使用addr2line分析堆栈,可以通过以下方式实现:

  1. 在BUILD.gn文件中添加调试符号配置:
executable("your_target") {
  # ...其他配置
  configs += [
    "//build/ohos:release",
  ]
  cflags = [ "-g" ]  # 保留调试信息
  ldflags = [ "-rdynamic" ]  # 保留动态符号表
}
  1. 或者使用更精细的配置:
executable("your_target") {
  # ...其他配置
  if (is_release) {
    cflags = [ "-g" ]
    ldflags = [ "-rdynamic" ]
    strip = false  # 禁止strip调试符号
  }
}
  1. 编译后可以通过以下命令验证是否包含调试信息:
readelf -S your_lib.so | grep debug
  1. 使用addr2line时:
addr2line -e your_lib.so -f -C <address>

注意:release模式保留调试信息会增加so文件大小,建议仅用于测试环境。

回到顶部