
项目中引入三方库后,线上出问题想进源码看看,却发现断点打不进去?
一、先分清:字节码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 调试提供两种方式:
方式一:在主工程中调试
-
在主工程中导入字节码 HAR 对应的模块,确保模块的层级目录与 HAR 包工程的保持一致(例如 HAR 模块都在工程根目录下)
-
导入成功后,由于 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 源码,需要:
-
将源码置于本地工程模块下
-
参考字节码 HAR 的方式一进行调试
建议
-
首次调试三方库:先按两个条件确认是字节码还是源码 HAR
-
ArkTS 断点打不进去:优先试方式一(主工程直接打断点),不行再走方式二配 Source Pairs
-
C++ 断点不生效 :检查
strip是否设为false,so 路径对不对,必要时用target.source-map映射 -
依赖路径别写错 :用
file://lib/xxx.har,别用file:../xxx
如果调试时发现断点显示为空心圆(未绑定),大概率是 sourceMap 路径映射没对上 ,重点排查 remoteUrl 和 localUrl 是否配置正确。