三方库源码调试
=======

三方共享包分为静态共享包HAR和动态共享包HSP，两种共享包的源码调试方式有所区别，具体请查看以下指导。

#### 区分字节码HAR和源码HAR

HAR包分为字节码HAR和源码HAR，同时满足以下两个条件的是字节码HAR，否则是源码HAR，更多关于如何构建源码HAR和字节码HAR的指导请查看[构建HAR](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-build-har)。

1.  查看HAR包的ets目录下存在.abc文件。
2.  查看HAR包的oh-package.json5文件，存在byteCodeHar字段并且值为true。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/d8/v3/Oo-xY5q2QgSiLnNz5v2vPA/zh-cn_image_0000002594634330.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=CB5D2AE801AB1A4A558D7F849C2F8ADFA38ADFA245E5A78162BA832BAB324B50)
    

#### 字节码HAR调试

#### \[h2\]C++代码调试

如果HAP/HSP引用字节码HAR包，同时HAR包中包含C++代码，参考以下步骤对该HAR包进行调试。

1.  点击**Run > Edit Configurations > Debugger** **>** **Symbol Directories**页签，点击**+**，添加带调试信息的so文件，so文件在{ProjectPath}/{ModuleName}/build/{product}/intermediates/libs/default/arm64-v8a路径下。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/94/v3/0zubzd2yTnydObS8RHHzJQ/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=C5D82CF269DF577C6DE928A0A863F95EF3714ED038A8B7AB10F9BDAF1B080416)
    
    在工程级或模块级build-profile.json5中添加strip字段并设置为false，可以生成带调试信息的so文件，具体请参考[配置CPP](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-cpp#section2182144382320)。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/d7/v3/51dgxbylRDGNJHPmXS555A/zh-cn_image_0000002625073913.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=F7A82387FBBD2BD4C275A8DD6AEC9971D7E4E57C6BE8E1079A4AE9EA2D719F28)
    
2.  DevEco Studio调试应用时会优先加载配置的so文件，本地so文件包含调试信息时，可以正常调试源码。由于so的源码文件信息为编译时的文件路径，若与本地的源码文件路径不一致时，需要关联源码文件，有两种方式：
    *   方式一：可以在**LLDB Startup Commands**页签中添加命令做映射，示例如下。
        
        settings set -- target.source-map {old-path} {new-path}
        
        *   old-path：编译时的文件路径。
        *   new-path：本地的源码文件路径。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/6f/v3/kb5-pmGvRQCIaMCfwYIiIg/zh-cn_image_0000002624993775.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=7F29548E296BDED281BE4DC7EF61FA0404E5AFA765BB2960800E857CB8533844)
        
    *   方式二：当Step Into进入汇编代码后，会弹出源码关联的提示，请点击**Select file**，选择本地对应C++源码进行关联。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ee/v3/s2muF-SZRei4LKKpYoU_ZQ/zh-cn_image_0000002594474418.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=7D8C11FC29333FE8B9FACA7461FBE92A133689BD8DA7804D80EF1FB59B777642)
        

#### \[h2\]ArkTS代码调试

假如在工程A（HAR包工程）中以debug模式编译得到字节码HAR包，工程B（主工程）中引用该字节码HAR包，并且本地有HAR包的源码，要调试该字节码HAR，有两种方式：在主工程中调试或在HAR包工程中调试。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/95/v3/nK1PTnolTZSL9-umzFwBqQ/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=A9CC053C51ADE4C32A1980D211ECF2288D92D7B56C96499F0B07C8B6D92F17B9)

release模式编译的字节码HAR不支持调试。

*   **方式一：在主工程中调试。**
    1.  在主工程中导入字节码HAR对应的模块，确保模块的层级目录与HAR包工程的保持一致，例如HAR模块都在工程根目录下。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/9f/v3/0_qtQN4QSRyVDhnUwF-6sg/zh-cn_image_0000002594634336.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=CE3A653CB9D945AF58B839FF8F2280B7EDD0B6ACDBFBD81426682A7B907EFCCF)
        
    2.  导入成功后，由于debug模式编译的字节码HAR中包含[sourceMap](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-exception-stack-parsing-principle)，调试时默认会关联当前工程的源码，此时可以在HAR模块上直接添加断点。
*   **方式二：在HAR包工程中调试，****通过修改前缀配置进行attach调试。**
    
    1.  在HAR包工程新建一个entry类型的demo主模块，如果主模块已存在则跳过本步骤。
    2.  在demo主模块的oh-package.json5中配置对字节码HAR包的依赖。
        
        // demo主模块的oh-package.json5
        "dependencies": {
          "@ohos/test\_stage\_ets\_library": "file:./lib/test\_stage\_ets\_library.har",
        }
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/da/v3/BHISXhNNSECFED9H-tsUCQ/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=01D3454EDDD1FB4BE67E6027E3F349FAB3D55C65345D68DD5CCD164087777175)
        
        如果在demo主模块的oh-package.json5中，配置对字节码HAR模块的依赖，如file:../test\_stage\_ets\_library，调试时可能导致断点无效。
        
    3.  在HAR包工程主模块中调用HAR模块的接口，确保编译后主模块的sourceMap文件中包含HAR模块的相关信息。
    4.  构建HAR包工程，打开主模块的sourceMap，根据HAR的oh-package.json5中的name进行查找，将Index文件的前缀路径记录为localUrl，例如以下的demo|test\_stage\_ets\_library|1.0.0。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2a/v3/LgNWRwkgRLeJJMikomyRMw/zh-cn_image_0000002594474412.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=03B9F508DFC2BAFCD24E95F512A5AE08FF9D43AF9FC1BC01A97E96BACF42A940)
        
    5.  主工程应用在设备上运行起来后，在HAR包工程中通过attach方式对该应用进行调试，在Debug窗口获取程序加载时的前缀，记录为remoteUrl，例如以下的entry|@ohos/test\_stage\_ets\_library|1.0.0。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/02/v3/umX56EFlSbq-uGYYTjDW_Q/zh-cn_image_0000002625073919.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=A3BEE20E38612BD05B969CE93910BA39F51AA4F0721602C86B05723899CA8425)
        
    6.  点击**Run > Edit Configurations > Debugger** **> ArkTS Source Pairs**，点击**+**，填写前两个步骤获取到的**remoteUrl**和**localUrl**。
        
        *   remoteUrl：应用程序加载HAR包的前缀路径。
        *   localUrl：本地生成sourceMap中HAR的前缀路径。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a9/v3/VglXbCg5Szyxt0js1Wcyaw/zh-cn_image_0000002594474408.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=F6F29EFF87384694187375DD41BB893BCF908BD72E6652EAE4197AD3BDAC54A4)
        
    7.  在HAR包工程中重新通过attach方式对主工程应用进行调试，此时可以在HAR模块上添加断点进行调试。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2a/v3/4qtzEcVATbu0B9ZDzpvYfA/zh-cn_image_0000002625073915.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=81EC819E949FE947227FBBBFC4318015776D120E2A5A90C2929C0647B252FB03)
        
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7b/v3/rirFxKI9TMWiTpdP-nknAw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=5B8084F64CB2682E04E5BABEB6862B7C4DB09E9F900CE99A0E325CDB7F9D7059)
    
    如果在HAR包工程中同时配置[Symbol Directories](#section177418333199)和ArkTS Source Pairs，可同时attach调试ArkTS和C++断点。
    

#### 源码HAR调试

#### \[h2\]C++代码调试

如果HAP/HSP引用源码HAR包，同时HAR包中包含C++代码，可参考[字节码HAR](#section177418333199)进行调试。

#### \[h2\]ArkTS代码调试

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

*   如果HAR包在本地没有对应源码，此时应用构建打包时引用的源码来源是工程级oh\_modules目录下的源码，只能针对oh\_modules下的源码进行调试。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/50/v3/M6m3I1RaQOWXh0LXeSP9Ww/zh-cn_image_0000002594474414.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=9206469D440C7A4D7D2815F5E4E5237FF45C19BF5932EE3243BC419FA2D0D34E)
    
*   如果HAR包在本地有对应源码，调试时可关联本地源码以实现对源码的调试，有两种方式。
    *   方式一：参考[字节码HAR调试](#section1035165781918)。
    *   方式二：当Step Into进入oh\_modules中的ets代码后，会弹出源码关联的提示时，请点击**Choose Sources**，选择本地对应ets源码进行关联。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/f8/v3/dA59BfHtSqehdwe2UYOXXQ/zh-cn_image_0000002594634334.png?HW-CC-KV=V1&HW-CC-Date=20260612T073900Z&HW-CC-Expire=86400&HW-CC-Sign=38F7BFE8BFFA86E2A09E327245BAED9B5EF8E5813E4B79CC1B4FF020A1D7289C)
        

#### HSP源码调试

如果要调试HSP源码，需要将源码置于本地工程模块下，参考[字节码HAR的方式一](#li17359570194)进行调试。