当前位置: 首页 > news >正文

鸿蒙(API 12 Beta2版)NDK开发【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版本]\base\native\llvm\bin。例如“sdk\HarmonyOS-NEXT-DP1\base\native\llvm\bin”。

lldb-server分为user用户工具和root用户工具。适用于user用户的lldb-server是带签名的工具。

路径说明
sdk[HarmonyOS版本]\openharmony\native\llvm\lib\clang\15.0.4\bin\aarch64-linux-ohos\lldb-server适用于root镜像aarch64-linux-ohos架构的lldb-server
sdk[HarmonyOS版本]\openharmony\native\llvm\lib\clang\15.0.4\bin\arm-linux-ohos\lldb-server适用于root镜像arm-linux-ohos架构的lldb-server
sdk[HarmonyOS版本]\openharmony\native\llvm\lib\clang\15.0.4\bin\arm-linux-ohos\lldb-server适用于root镜像x86_64-linux-ohos架构的lldb-server
sdk[HarmonyOS版本]\hms\native\lldb\aarch64-linux-ohos\lldb-server适用于user镜像aarch64-linux-ohos架构的lldb-server
sdk[HarmonyOS版本]\hms\native\lldb\arm-linux-ohos\lldb-server适用于user镜像aarch64-linux-ohos架构的lldb-server
sdk[HarmonyOS版本]\hms\native\lldb\x86_64-linux-ohos\lldb-server适用于user镜像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

#include <iostream>
using namespace std;
int main() {cout << "hello world!" <<endl;return 0;
}

编译:

<clang distribution>/bin/clang++ -g hello.cpp -o a.out
  1. 获取到与LLDB同一版本的clang编译器生成的带有调试信息的可执行文件a.out。

  2. 运行LLDB工具,并指定要调试的文件为a.out。

    ./lldb a.out
    
  3. 在代码中main函数处设置断点。

    (lldb) b main
    
  4. 运行应用,使其停在断点处。

    (lldb) run
    
  5. 继续运行应用。

    (lldb) continue
    
  6. 列出所有断点。

    (lldb) breakpoint list
    
  7. 显示当前帧的参数和局部变量。

    (lldb) frame variable
    
  8. 按需执行调试命令进行后续调试操作。

  9. 退出调试。

    (lldb) quit
    

使用LLDB工具调试已经启动的应用

此处以在Mac环境调试一个使用clang编译器生成的带有调试信息和用户输入的可执行文件a.out为例。

源文件:hello.cpp

#include <iostream>
using namespace std;int main() {int i = 0, j = 5, sum = 0;cout << "Please input a number of type int”" <<endl;cin >> i;cout << i;sum = i + j;cout << sum <<endl;return 0;
}

编译:

<clang distribution>/bin/clang++ -g hello.cpp -o a.out
  1. 在终端窗口1启动应用。(窗口会返回一条信息“Please input a number of type int”)

    ./a.out
    
  2. 在终端窗口2运行LLDB工具。

    ./lldb
    
  3. attach应用。

    (lldb) process attach --name a.out
    
  4. 在hello.cpp的第10行设置断点。

    (lldb) breakpoint set --file hello.cpp --line 10
    
  5. 在终端窗口1,输入一个int类型的数。

    88
    
  6. 在终端行窗口2继续运行应用,使应用停在断点处。

    (lldb) continue
    
  7. 按需执行调试命令进行后续调试操作。

  8. detach应用。

    (lldb) detach
    
  9. 退出调试。

    (lldb) quit
    

说明

步骤[attach应用]和[设置断点]可以调换顺序执行。

使用指导-远程调试

说明

  • 基于HUAWEI DevEco Studio的远程调试参考[官方调试指导]
  • 远程调试时需要lldb-server和lldb配合使用。注意根据设备镜像选择user或root版的lldb-server。
  • Windows,Linux x86_64和Mac远程调试步骤一致。

Windows平台连接aarch64-linux-ohos架构root镜像SELinux关闭的Harmony设备进行远程调试

源文件:hello.cpp

#include <iostream>
using namespace std;
int main() {cout << "hello world!" <<endl;return 0;
}

编译:

<clang distribution>/bin/clang++ --target=aarch64-linux-ohos --sysroot=<sysroot distribution> -g hello.cpp -o a.out
  1. 打开命令行窗口1,将lldb-server和可执行文件a.out推送到设备。
hdc file send lldb-server /data/local/tmp
hdc file send a.out /data/local/tmp
hdc shell chmod 755 /data/local/tmp/lldb-server /data/local/tmp/a.out
  1. 运行lldb-server。(8080为有效且当前未被占用的端口号,用户可自定义)

    hdc shell ./data/local/tmp/lldb-server p --server --listen "*:8080"
    
  2. 打开命令行窗口2,运行二进制文件lldb。

    lldb
    
  3. 在LLDB命令行窗口进行远端选择与连接。

    (lldb) platform select remote-ohos
(lldb) platform connect connect://localhost:8080 
  1. 指定要调试的设备上的二进制文件a.out。

    (lldb) target create /data/local/tmp/a.out
    
  2. 在代码中main函数处设置断点。

    (lldb) b main
    
  3. 启动应用。

    (lldb) run
    
  4. 查看当前目标进程的源码。

    (lldb) source list
    
  5. 按需执行调试命令进行后续调试操作。

  6. 退出调试。

    (lldb) quit
    

Windows平台连接aarch64-linux-ohos架构user镜像SELinux开启的HarmonyOS设备进行远程调试

说明

  • 调试过程中需保持设备在非锁屏状态,锁屏不允许启动调试器调试。
  • 基于HUAWEI DevEco Studio调试user镜像SELinux开启的HarmonyOS设备的hap包。

FAQ

  • 当在lldb命令行窗口执行run返回信息为:“error:‘A’ packet returned an error: 8”或类似信息,则意味着不允许调试器启动用于调试的进程,一般都是因为没有权限导致的,请确认调试设备是否限制调试。
  • 运行lldb-server,报错“Permission denied”。一般是lldb-server无可执行文件导致的,添加权限即可。

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关文章:

鸿蒙(API 12 Beta2版)NDK开发【LLDB高性能调试器】调试和性能分析

概述 LLDB&#xff08;Low Level Debugger&#xff09;是新一代高性能调试器。 当前HarmonyOS中的LLDB工具是在[llvm15.0.4]基础上适配演进出来的工具&#xff0c;是HUAWEI DevEco Studio工具中默认的调试器&#xff0c;支持调试C和C应用。 工具获取 可通过HUAWEI DevEco S…...

HAL库源码移植与使用之DMA

内存到内存不支持传输计数器自动重装 结构&#xff1a; 与DMA具有连线的外设都可以完成搬运 DMA触发源 DMA优先级分配 由仲裁器来决定 寄存器作用&#xff1a; DMA.C #include "./BSP/DMA/dma.h" #include "./SYSTEM/delay/delay.h"DMA_HandleTypeDef…...

Scrapy爬虫框架介绍、创建Scrapy项目

Scrapy官网&#xff1a;https://scrapy.org/ 什么是Scrapy Scrapy 是一个基于 Python 的快速的高级网页抓取和网页爬取框架&#xff0c;用于抓取网站并从其页面中提取结构化数据。它可用于多种用途&#xff0c;从数据挖掘到监控和自动化测试。 Scrapy核心组件 1. Scrapy Engin…...

如何监测某个进程是否退出(C++)?

使用WaitForSingleObject函数&#xff0c;可以判断进程是否退出。 WaitForSingleObject函数的作用是&#xff1a;等待直到指定的对象处于信号状态&#xff08;通知状态&#xff09;或到达指定的等待时间&#xff08;超时时间&#xff09;。 函数声明如下&#xff1a; 1 DWOR…...

Python:Neo 库读取 ABF 文件,数据格式详解

Neo 库读取 ABF 文件后的数据格式 neo 是一个用于处理电生理数据的 Python 库&#xff0c;支持多种数据格式&#xff0c;包括 ABF 文件。了解 neo 读入 ABF 文件后的数据结构非常重要&#xff0c;以下给大家介绍一下使用 neo 读取 ABF 文件&#xff0c;及其对象格式。 1. ABF…...

【Linux】网络基础_3

文章目录 十、网络基础5. socket编程socket 常见APIsockaddr结构简单的UDP网络程序 未完待续 十、网络基础 5. socket编程 socket 常见API // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服…...

C++之从C过渡(上)

C之从C过渡 前言 暂时告别C语言&#xff0c;我们走进C。对于有C语言基础&#xff0c;初学C的我们来说&#xff0c;在正式学习C的主体内容之前&#xff0c;我们需要先有一个过渡&#xff0c;本文中会总结过渡需要了解的零散知识&#xff0c;主要是语法。 正文 C的第一个程序 …...

MongoDB 100问

基础问题 1. 什么是MongoDB&#xff1f; MongoDB是一种面向文档的NoSQL数据库&#xff0c;使用BSON&#xff08;二进制JSON&#xff09;格式存储数据。它支持动态模式设计&#xff0c;具有高性能、高可用性和易扩展性。 2. MongoDB和传统关系型数据库的区别是什么&#xff1f…...

Arduino ESP32使用 HardwareSerial创建一个任意串口

文章目录 前言使用 `HardwareSerial` 创建任意串口创建 `HardwareSerial` 对象示例代码`begin` 函数总结前言 在 Arduino 项目中,串口通信是一种常见且重要的通信方式。ESP32 作为一款功能强大的微控制器,提供了多个 UART(通用异步收发传输器)接口,允许用户灵活地进行串口…...

数据中台建设之数据存储

目录 一、技术选型需要明确的问题 二、技术选型需要考虑的几个方面 2.1 数据规模 2.2 数据生产方式 2.3 数据应用方式 三、技术选型的场景分析 3.1 概述 3.2 在线与离线 3.2.1 在线存储 3.2.2 离线存储 3.3 OLTP与OLAP 3.3.1 OLTP 3.3.2 OLAP 3.3.3 OLTP与OLAP的关…...

最常见的AI大模型总结

前言&#xff1a;大模型可以根据其主要的应领域和功能&#xff0c;可以分类为“文生文”&#xff08;Text-to-Text&#xff09;、“文生图”&#xff08;Text-to-Image&#xff09;和“文生视频”&#xff08;Text-to-Video&#xff09;&#xff0c;都是基于自然语言处理&#…...

源码安装docker和docker-compose

前言 前提条件&#xff1a;内核要求 目前&#xff0c;CentOS 仅发行版本中的内核支持 Docker。 Docker 运行在 CentOS 7 上&#xff0c;要求系统为64位、系统内核版本为3.10 以上。 Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上&#xff0c;要求系统为64位、系统内核版…...

Java、PHP、Node 操作 MySQL 数据库常用方法

一、Java 操作 MySQL 数据库 1、Java 连接 MySQL 数据库 1. 使用 JDBC 驱动程序连接 使用这种方式&#xff0c;首先需要导入 MySQL 的 JDBC 驱动程序依赖&#xff0c;然后通过 Class.forName() 方法加载驱动程序类。其创建连接的过程相对直接&#xff0c;只需提供准确的数据库…...

nVisual分享社区正式上线啦!

nVisual分享社区正式上线啦&#xff01; 访问地址&#xff1a;分享社区 nVisual是耐威迪基于数字孪生技术物联网技术开发的一款基础设施数字孪生软件工具&#xff0c;主要实现OSP室外与ISP室内基础设施的规划、记录、分析的可视化管理。 规划&#xff1a;nVisual可视化、智能化…...

4.5.门控循环单元GRU

门控循环单元GRU ​ 对于一个序列&#xff0c;不是每个观察值都是同等重要的&#xff0c;可能会遇到一下几种情况&#xff1a; 早期观测值对预测所有未来观测值都具有非常重要的意义。 考虑极端情况&#xff0c;第一个观测值包含一个校验和&#xff0c;目的是在序列的末尾辨别…...

10种 Python数据结构,从入门到精通

今天我们将深入探讨 Python 中常用的数据结构&#xff0c;帮助你从基础到精通。每种数据结构都有其独特的特点和适用场景&#xff0c;通过实际代码示例和生活中的比喻&#xff0c;让你更容易理解这些概念。 学习数据结构的三个阶段 1、掌握基本用法&#xff1a;使用这些数据结…...

【AI】人工智能时代,程序员如何保持核心竞争力?

目录 程序员在AI时代的应对策略1. 引言2. AI在编程领域的影响2.1 AI辅助编程工具的现状2.2 AI对编程工作的影响2.3 程序员的机遇与挑战 3. 深耕细作&#xff1a;专注领域的深度学习3.1 专注领域的重要性3.2 深度学习的策略3.2.1 选择合适的领域3.2.2 持续学习和研究3.2.3 实践与…...

WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)

WrapPanel控件&#xff08;瀑布流布局&#xff09; WrapPanel控件表示将其子控件从左到右的顺序排列&#xff0c;如果第一行显示不了&#xff0c;则自动换至第二行&#xff0c;继续显示剩余的子控件。我们来看看它的结构定义&#xff1a; public class WrapPanel : Panel {pub…...

【python】Python中实现定时任务常见的几种方式原理分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

老公请喝茶,2024年老婆必送老公的养生茶,暖暖的很贴心

在这个快节奏的时代&#xff0c;每个人都在为生活奔波&#xff0c;而家的温馨与关怀&#xff0c;成了我们最坚实的后盾。随着2024年的已经过半&#xff0c;作为妻子&#xff0c;你是否也在寻找一份特别的礼物&#xff0c;来表达对老公深深的爱意与关怀&#xff1f;在这个充满爱…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...