鸿蒙三方库源码调试

项目中引入三方库后,线上出问题想进源码看看,却发现断点打不进去?

一、先分清:字节码HAR vs 源码HAR

HAR 包分为字节码 HAR 和源码 HAR ,判断标准是同时满足以下两个条件即为字节码 HAR,否则是源码 HAR:

条件 说明
1 查看 HAR 包的 ets 目录下存在 abc 文件
2 查看 HAR 包的 oh-package.json5 文件,存在 byteCodeHar 字段并且值为 true

二、字节码HAR调试

2.1 C++代码调试

如果 HAP/HSP 引用字节码 HAR 包,同时 HAR 包中包含 C++ 代码,按以下步骤调试:

步骤1:添加带调试信息的 so 文件

  • 点击 Run > Edit Configurations > Debugger 页签

  • 点击 + 添加带调试信息的 so 文件

  • so 文件路径:[ProjectPath]/[ModuleName]/build/{product}/intermediates/libs/default/arm64-v8a

说明 :在工程级或模块级 build-profile.json5 中添加 strip 字段并设置为 false,可以生成带调试信息的 so 文件。

步骤2:关联源码文件

DevEco Studio 调试时会优先加载配置的 so 文件,本地 so 文件包含调试信息时,可以正常调试源码。

但 so 的源码文件信息为编译时的文件路径,若与本地的源码文件路径不一致,需要关联源码文件,有两种方式:

方式 操作
方式一 在 LLDB Startup Commands 页签中添加命令做映射: settings set -- target.source-map {old-path} {new-path} • old-path:编译时的文件路径 • new-path:本地的源码文件路径
方式二 当 Step Into 进入汇编代码后 ,会弹出源码关联的提示,点击 Select file,选择本地对应 C++ 源码进行关联

2.2 ArkTS代码调试

字节码 HAR 的 ArkTS 调试提供两种方式:

方式一:在主工程中调试
  1. 在主工程中导入字节码 HAR 对应的模块,确保模块的层级目录与 HAR 包工程的保持一致(例如 HAR 模块都在工程根目录下)

  2. 导入成功后,由于 debug 模式编译的字节码 HAR 中包含 sourceMap ,调试时默认会关联当前工程的源码 ,此时可以在 HAR 模块上直接添加断点

方式二:在 HAR 包工程中调试(通过修改前缀配置进行 attach 调试)
步骤 操作
1 在 HAR 包工程新建一个 entry 类型的 demo 主模块(如已存在则跳过)
2 在 demo 主模块的 oh-package.json5 中配置对字节码 HAR 包的依赖
3 在 HAR 包工程主模块中调用 HAR 模块的接口,确保编译后主模块的 sourceMap 文件中包含 HAR 模块的相关信息
4 构建 HAR 包工程,打开主模块的 sourceMap ,根据 HAR 的 oh-package.json5 中的 name 进行查找,将 Index 文件的前缀路径记录为 localUrl
5 主工程应用在设备上运行后,在 HAR 包工程中通过 attach 方式调试,在 Debug 窗口获取程序加载时的前缀,记录为 remoteUrl
6 点击 Run > Edit Configurations > Debugger > ArkTS Source Pairs ,点击 + ,填写 remoteUrl 和 localUrl
7 在 HAR 包工程中重新通过 attach 方式 对主工程应用进行调试,此时可以在 HAR 模块上添加断点进行调试

步骤2的依赖配置示例:

复制代码
// demo 主模块的 oh-package.json5
"dependencies": {
  "@ohos/test_stage_ets_library": "file://lib/test_stage_ets_library.har",
}

说明 :如果在 demo 主模块的 oh-package.json5 中配置对字节码 HAR 模块的依赖为 file:../test_stage_ets_library ,调试时可能导致断点无效。

步骤6的两个 URL 含义:

字段 含义
remoteUrl 应用程序加载 HAR 包的前缀路径
localUrl 本地生成 sourceMap 中 HAR 的前缀路径

说明 :如果在 HAR 包工程中同时配置 Symbol Directories 和 ArkTS Source Pairs ,可同时 attach 调试 ArkTS 和 C++ 断点。

三、源码HAR调试

3.1 C++代码调试

如果 HAP/HSP 引用源码 HAR 包,同时 HAR 包中包含 C++ 代码,可参考字节码 HAR 的 C++ 调试方式进行调试。

3.2 ArkTS代码调试

工程中引用源码 HAR 包,对该 HAR 包进行调试,根据本地是否有源码,调试方式分别如下:

情况一:本地没有对应源码
  • 应用构建打包时引用的源码来源是工程级 oh_modules 目录下的源码

  • 只能针对 oh_modules 下的源码进行调试

情况二:本地有对应源码

调试时可关联本地源码以实现对源码的调试,有两种方式:

方式 操作
方式一 参考字节码 HAR 调试的方式
方式二 当 Step Into 进入 oh_modules 中的 ets 代码后 ,会弹出源码关联的提示,点击 Choose Sources,选择本地对应 ets 源码进行关联

四、HSP源码调试

如果要调试 HSP 源码,需要:

  1. 将源码置于本地工程模块下

  2. 参考字节码 HAR 的方式一进行调试

建议

  • 首次调试三方库:先按两个条件确认是字节码还是源码 HAR

  • ArkTS 断点打不进去:优先试方式一(主工程直接打断点),不行再走方式二配 Source Pairs

  • C++ 断点不生效 :检查 strip 是否设为 false,so 路径对不对,必要时用 target.source-map 映射

  • 依赖路径别写错 :用 file://lib/xxx.har,别用 file:../xxx

如果调试时发现断点显示为空心圆(未绑定),大概率是 sourceMap 路径映射没对上 ,重点排查 remoteUrl 和 localUrl 是否配置正确。

相关推荐
用户117910488333 小时前
AI输出满屏井号星号?hmharness把Markdown渲染成终端表格 GitHub:swsgbl/hmharness
ai编程·harmonyos
了一1235 小时前
鸿蒙ArkWeb 长截图(滚动截图)技术方案总结
harmonyos
熊猫钓鱼>_>6 小时前
平行视界兼容模式与魔法变量配置避坑【鸿蒙心迹】
运维·服务器·开发语言·笔记·华为·harmonyos·openharmony
罗四强6 小时前
第2篇:环境搭建:DevEco Studio 安装 + 第一个 Hello World
harmonyos·鸿蒙·鸿蒙系统
用户117910488337 小时前
AI终端里复制不了代码?hmharness把鼠标还给终端 GitHub:swsgbl/hmharness
ai编程·harmonyos
贾伟康10 小时前
HarmonyOS 端侧智能体长对话压缩:摘要版本、证据索引与安全回退
harmonyos·arkts·状态恢复·上下文压缩·端侧智能体
NJPJI_Yang11 小时前
鸿蒙操作系统小艺 Skill 开发实战:让应用被 HarmonyOS 7 一句话召唤
pytorch·深度学习·harmonyos
redtank200012 小时前
纯血鸿蒙学习效率三件套实测:背单词艾宾浩斯曲线、时间记录与睡眠辅助
学习·华为·harmonyos
打工仔折腾 AI12 小时前
鸿蒙移动端直连 Windows 远程桌面配置与性能调优实践
人工智能·windows·后端·python·华为·性能优化·harmonyos