鸿蒙5.0开发进阶:NDK代码开发-调试和性能优化(LLDB高性能调试器)

[复制链接]
发表于 2025-9-27 09:20:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)



  • 鸿蒙开发核心知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开发实战学习门路
  • 鸿蒙HarmonyOS NEXT开发技能最全学习门路指南
  • 鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)

LLDB高性能调试器

概述

LLDB(Low Level Debugger)是新一代高性能调试器。
当前HarmonyOS中的LLDB工具是在llvm15.0.4底子上适配演收支来的工具,是HUAWEI DevEco Studio工具中默认的调试器,支持调试C和C++应用。
工具获取

可通过HUAWEI DevEco Studio下载SDK获取LLDB调试工具。
以Windows平台为例,lldb.exe的存放路径为sdk\[HarmonyOS版本]\openharmony\native\llvm\bin。比方“sdk\HarmonyOS-NEXT-DP1\openharmony\native\llvm\bin”。
表1 lldb-server工具目次  路径
  分析
  sdk\[HarmonyOS版本]\hms\native\lldb\aarch64-linux-ohos\lldb-server
  实用于aarch64-linux-ohos架构的lldb-server
  sdk\[HarmonyOS版本]\hms\native\lldb\arm-linux-ohos\lldb-server
  实用于arm-linux-ohos架构的lldb-server
  sdk\[HarmonyOS版本]\hms\native\lldb\x86_64-linux-ohos\lldb-server
  实用于x86_64-linux-ohos架构的lldb-server
  功能列表

此处罗列LLDB调试器支持的部分功能,更多下令参考:LLDB工具使用引导和LLDB官网手册。Windows、Linux x86_64和Mac平台的LLDB工具有些许差别,以实际应用为准。


  • 记录日志日志
  • 断点管理
  • 观察点管理
  • 表达式处理处罚
  • 检察变量
  • 历程/线程管理
  • 汇编处理处罚
  • 源码信息获取
  • 信号处理处罚
  • 历程启动
  • attach历程
应用场景



  • 本地调试

    • Linux x86_64本地调试。
      LLDB支持在Linux x86_64环境上调试C和C++应用。
    • Mac桌面本地调试。
      LLDB支持在Mac桌面(包罗Mac x86_64和M1体系)调试C和C++应用。

  • 远程调试

    • 基于HUAWEI DevEco Studio的远程调试。
      LLDB支持基于HUAWEI DevEco Studio在Windows和Mac桌面毗连HarmonyOS装备或模拟器远程调试Native C++应用,纵然用HUAWEI DevEco Studio的Debug调试功能。
    • 桌面毗连HarmonyOS装备远程调试。
      HarmonyOS装备为root镜像,SELinux关闭:LLDB支持在Windows、Mac桌面和Linux x86_64环境直连HarmonyOS装备远程调试C和C++应用以及可实行二进制。
      HarmonyOS装备为root镜像,SELinux开启:LLDB支持在Windows、Mac桌面和Linux x86_64环境直连HarmonyOS装备远程调试C和C++应用以及可实行二进制,但是lldb-server和要调试的应用或可实行二进制只能放在/data/local/tmp/debugserver目次内。
      HarmonyOS装备是user镜像,SELinux开启:LLDB支持在Windows、Mac桌面和Linux x86_64环境直连HarmonyOS装备远程调试基于HUAWEI DevEco Studio编译的带署名的debug版本的hap包,现在仅支持此类调试。
                 分析
            root镜像:使用hdc shell id下令查询到“uid=0(root)”,或实行hdc shell进入交互下令环境,提示符为“#”。
            user镜像:使用hdc shell id下令查询到“uid=2000(shell)”,或实行hdc shell进入交互下令环境,提示符为“$”。
            SELinux开启模式:使用hdc shell getenforce下令查询到“Enforcing”。
            SELinux关闭模式:使用hdc shell getenforce下令查询到“Permissive”。

使用引导-本地调试

   分析
  Linux x86_64或Mac本地调试步调划一。
  使用LLDB工具启动并调试应用

此处以在Linux x86_64环境调试一个使用clang编译器天生的带有调试信息的可实行文件a.out为例。
源文件:hello.cpp
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4.     cout << "hello world!" <<endl;
  5.     return 0;
  6. }
复制代码
编译:
  1. <clang distribution>/bin/clang++ -g hello.cpp -o a.out
复制代码

  • 获取到与LLDB同一版本的clang编译器天生的带有调试信息的可实行文件a.out。
  • 运行LLDB工具,并指定要调试的文件为a.out。
    1. ./lldb a.out
    复制代码
  • 在代码中main函数处设置断点。
    1. (lldb) b main
    复制代码
  • 运行应用,使其停在断点处。
    1. (lldb) run
    复制代码
  • 继承运行应用。
    1. (lldb) continue
    复制代码
  • 列出全部断点。
    1. (lldb) breakpoint list
    复制代码
  • 体现当前帧的参数和局部变量。
    1. (lldb) frame variable
    复制代码
  • 按需实行调试下令举行后续调试操纵。
  • 退出调试。
    1. (lldb) quit
    复制代码
使用LLDB工具调试已经启动的应用

此处以在Mac环境调试一个使用clang编译器天生的带有调试信息和用户输入的可实行文件a.out为例。
源文件:hello.cpp
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4.     int i = 0, j = 5, sum = 0;
  5.     cout << "Please input a number of type int”" <<endl;
  6.     cin >> i;
  7.     cout << i;
  8.     sum = i + j;
  9.     cout << sum <<endl;
  10.     return 0;
  11. }
复制代码
编译:
  1. <clang distribution>/bin/clang++ -g hello.cpp -o a.out
复制代码

  • 在终端窗口1启动应用。(窗口会返回一条信息“Please input a number of type int”)
    1. ./a.out
    复制代码
  • 在终端窗口2运行LLDB工具。
    1. ./lldb
    复制代码
  • attach应用。
    1. (lldb) process attach --name a.out
    复制代码
  • 在hello.cpp的第10行设置断点。
    1. (lldb) breakpoint set --file hello.cpp --line 10
    复制代码
  • 在终端窗口1,输入一个int范例的数。
    1. 88
    复制代码
  • 在终端行窗口2继承运行应用,使应用停在断点处。
    1. (lldb) continue
    复制代码
  • 按需实行调试下令举行后续调试操纵。
  • detach应用。
    1. (lldb) detach
    复制代码
  • 退出调试。
    1. (lldb) quit
    复制代码
   分析
  步调attach应用和设置断点可以变更次序实行。
  使用引导-远程调试

   分析
  

  • 远程调试是挑拨用lldb举行跨端调试。本章节重要针对开发者跨平台调试HarmonyOS装备的应用举行分析。
  • 基于HUAWEI DevEco Studio的远程调试参考官方调试引导
  • 远程调试时必要lldb-server和lldb共同使用。
  • Windows,Linux x86_64和Mac远程调试步调划一。
  root镜像远程调试

   分析
  

  • 支持调试的应用或二进制是aarch64-linux-ohos架构的native C++工程。
  • 为了方便调试发起调试时关闭SELinux。
  源文件:hello.cpp
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4.     cout << "hello world!" <<endl;
  5.     return 0;
  6. }
复制代码
编译:
  1. <clang distribution>/bin/clang++ --target=aarch64-linux-ohos --sysroot=<sysroot distribution> -g hello.cpp -o a.out
复制代码

  • 打开下令行窗口1,关闭SELinux。
    1. hdc shell setenforce 0
    复制代码
  • 在下令行窗口1,将lldb-server和可实行文件a.out推送到装备。
    1. hdc file send lldb-server /data/local/tmp
    2. hdc file send a.out /data/local/tmp
    3. hdc shell chmod 755 /data/local/tmp/lldb-server /data/local/tmp/a.out
    复制代码
  • 运行lldb-server。(8080为有用且当前未被占用的端标语,用户可自界说)
    1. hdc shell ./data/local/tmp/lldb-server p --server --listen "*:8080"
    复制代码
  • 打开下令行窗口2,运行二进制文件lldb。
    1. lldb
    复制代码
  • 在LLDB下令行窗口举行远端选择与毗连。
    1. (lldb) platform select remote-ohos
    2. (lldb) platform connect connect://localhost:8080
    复制代码
  • 指定要调试的装备上的二进制文件a.out。
    1. (lldb) target create /data/local/tmp/a.out
    复制代码
  • 在代码中main函数处设置断点。
    1. (lldb) b main
    复制代码
  • 启动应用。
    1. (lldb) run
    复制代码
  • 检察当前目标历程的源码。
    1. (lldb) source list
    复制代码
  • 按需实行调试下令举行后续调试操纵。
  • 退出调试。
    1. (lldb) quit
    复制代码
user镜像远程调试

   分析
  

  • user镜像SELinux默认开启,无法关闭。
  • 发起基于HUAWEI DevEco Studio调试user镜像SELinux开启的HarmonyOS装备的hap包。
  • lldb-server需推送至指定的目次/data/local/tmp/debugserver。如:/data/local/tmp/debugserver/lldb-server或/data/local/tmp/debugserver/com.example.myapplication/lldb-server。
  • lldb-server在aarch64-linux-ohos架构目次获取。
  • 此案例中的hap包为基于HUAWEI DevEco Studio创建的native C++默认工程编译的带debug信息的hap包。
  • 调试过程中需保持装备在非锁屏状态,锁屏不允许启动调试器调试。
  

  • 打开下令行窗口1,将lldb-server和hap包推送到装备。
    1. hdc shell mkdir data/local/tmp/debugserver/com.example.myapplication
    2. hdc file send lldb-server data/local/tmp/debugserver/com.example.myapplication
    3. hdc shell chmod 755 data/local/tmp/debugserver/com.example.myapplication/lldb-server
    4. hdc shell mkdir data/local/tmp/d333e74fe3ab488aad622a7055fbf396
    5. hdc file send C:\Users\xxx\DevEcoStudioProjects\MyApplication\entry\build\default\outputs\default\entry-default-signed.hap data/local/tmp/d333e74fe3ab488aad622a7055fbf396
    复制代码
  • hap包安装运行,关闭appfreeze。
    1. hdc shell bm install -p data/local/tmp/d333e74fe3ab488aad622a7055fbf396
    2. hdc shell aa start -a EntryAbility -b com.example.myapplication
    3. hdc shell aa attach -b com.example.myapplication
    复制代码
  • 运行lldb-server。
    1. hdc shell aa process -a EntryAbility -b com.example.myapplication -D "/data/local/tmp/debugserver/com.example.myapplication/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
    复制代码
  • 打开下令行窗口2,运行二进制文件lldb。
    1. lldb
    复制代码
  • 在LLDB下令行窗口举行远端选择与毗连。
    1. (lldb) platform select remote-ohos
    2. (lldb) platform connect unix-abstract-connect:///lldb-server/platform.sock
    复制代码
  • 添加目标可实行文件搜刮路径。
    1. (lldb) settings append target.exec-search-paths "C:\Users\xxx\DevEcoStudioProjects\MyApplication \entry\build\default\intermediates\cmake\default\obj\arm64-v8a"
    复制代码
  • 在源代码第6行处设置断点。
    1. (lldb) breakpoint set --file "C:/Users/xxx/DevEcoStudioProjects/MyApplication/entry/src/main/cpp/napi_init.cpp" --line 6
    复制代码
  • 指定要调试的装备上的hap包对应的应用pid。
    1. (lldb) attach <pid>
    复制代码
  • 点击装备应用,使其继承相应,并克制在断点处。
  • 继承调试。
    1. (lldb) continue
    复制代码
  • 体现当火线程的堆栈回溯。
    1. (lldb) bt
    复制代码
  • 按需实行调试下令举行后续调试操纵。
  • 退出调试。
    1. (lldb) quit
    复制代码
FAQ



  • 当在lldb下令行窗口实行run返复书息为:“error:'A' packet returned an error: 8”或雷同信息,则意味着不允许调试器启动用于调试的历程,一样寻常都是由于没有权限导致的,请确认调试装备是否限定调试。


  • 运行lldb-server,报错“Permission denied”。一样寻常是lldb-server无可实行文件导致的,添加权限即可。


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表