【开源鸿蒙】调试OpenHarmony轻量系统QEMU RISC-V版本

【开源鸿蒙】调试OpenHarmony轻量系统QEMU RISC-V版本

    • 一、准备工作
      • 1.1 编译OpenHarmony源码
      • 1.2 确认OHOS_Image已生成
      • 1.3 确认OHOS_Image文件是否有调试信息
      • 1.4 检查config.gni文件是否有-g编译选项
    • 二、GDB调试
      • 2.1 启动QEMU模拟器
      • 2.2 启动GDB调试器
      • 2.3 连接QEMU模拟器
      • 2.4 使用GDB进行断点调试
    • 三、问题解决
      • 3.1 找不到 ohos_config.json
    • 四、参考链接

本文将介绍如何使用gdb调试OpenHarmony轻量系统的QEMU RISC-V版本,对于想要研究OpenHarmony操作系统,手边又没有实际开发板的朋友,本文将会非常有帮助。

一、准备工作

前面几篇系列文章介绍了如何下载OpenHarmony 4.1 Release源代码,以及如何编译OpenHarmony轻量系统的QEMU RISC-V版本,对这些内容还不清楚的小伙伴,可以移步前面几篇文章:

  • 如何下载OpenHarmony 4.1 Release源代码?
    • 链接:【开源鸿蒙】下载 OpenHarmony 4.1 Release 源代码-CSDN博客
  • 如何编译OpenHarmony轻量系统的QEMU RISC-V版本?
    • 链接: 【开源鸿蒙】编译OpenHarmony轻量系统QEMU RISC-V版-CSDN博客

1.1 编译OpenHarmony源码

上一篇文章介绍了如何为QEMU RISC-V虚拟平台构建OpenHarmony轻量系统。

构建完成后,输出如下:

Untitled

1.2 确认OHOS_Image已生成

hb set选择qemu_riscv_mini_system_demo平台后,hb build命令构建的输出将会生成到out/riscv32_virt/qemu_riscv_mini_system_demo 目录,具体生成内容如下:

Untitled

其中,OHOS_Image就是本文将要运行的RISC-V平台的OpenHarmony轻量系统ELF文件。

1.3 确认OHOS_Image文件是否有调试信息

使用gdb调试目标程序时,目标程序最好带有调试信息,这样方便查看函数名和代码行。

通过 file 命令查看 OHOS_Image文件是否代码调试信息,如下图所示:

Untitled

输出带有with debug_info,则表示带有调试信息。

1.4 检查config.gni文件是否有-g编译选项

gcc的-g选项可以生成带调试信息的二进制文件,方便gdb调试时看到函数名和代码行。

如果前面的file命令的输出中没有 with debug_info,则需要检查是否带有-g编译选项。

对于QEMU RISC-V平台,查看如下文件:
device/qemu/riscv32_virt/liteos_m/config.gni

检查其内容,是否有如下代码:
board_opt_flags = [ "-g" ]

在最近更新的4.1 Release版本中,该文件中默认以及有-g编译选项;如果没有的话,可以手动添加-g选项。

二、GDB调试

gdb是GNU调试器(GNU Debugger),这里不再过多介绍了。

2.1 启动QEMU模拟器

我们已经确定OHOS_Image文件带有调试信息,接下来就可以启动QEMU模拟器并运行这个ELF文件了,使用如下命令:

./qemu-run -g

执行上述命令后,终端输出如下:

Untitled

此时,先不要在终端进行操作,等待后续的GDB调试器启动。

2.2 启动GDB调试器

另外打开一个终端窗口,使用如下命令:

# 跳转到源码目录
cd ~/ohos/openharmony# 启动gdb调试器
riscv32-unknown-elf-gdb out/riscv32_virt/qemu_riscv_mini_system_demo/OHOS_Image

执行上述命令后,终端输出如下:

Untitled

此时,gdb调试器已经成功启动,从终端的输出中,可以看到gdb已经成功加载了符号信息。

2.3 连接QEMU模拟器

在刚刚启动的gdb会话中,输入如下命令:

target remote localhost:1234

执行上述命令后,gdb输出如下:

Untitled

此时,gdb已经连接到另外一个终端的QEMU模拟器了。

2.4 使用GDB进行断点调试

在gdb调试器中,我们输入命令:

l main

即可查看main函数开始处的代码:

Untitled

回车可以继续查看后面的代码,这里不再展示。

使用如下命令,添加断点:

b main

这个命令将会在main函数开始处添加一个断点。

添加完断点后,执行如下命令:

c

这里的c表示继续,用 continue 也可以。

执行完c命令后,gdb输出如下:

Untitled

激动人心的时刻——已经运行到main函数,并且在我们添加的断点暂停了。

接下来,使用n命令进行Step Over调试:

Untitled

这边我们使用n走过了一行printf打印,此时查看运行QEMU的终端,可以看到成功打印了字符串:

Untitled

更多gdb调试命令,可以参考: GDB常用调试命令 — C/C++ Note 1.0.0 文档 (c-cpp-note.readthedocs.io)

三、问题解决

3.1 找不到 ohos_config.json

如果执行qemu-run命令提示如下错误:

Untitled

【直接原因】因为qemu-run脚本找不到ohos_config.json文件。

【问题根因】OpenHarmony 4.1-Release版本中,hb命令创建的ohos_config.json文件不再位于顶层,而是位于out目录内。

【解决方法】顶层目录创建符号链接,指向out/ohos_config.json,执行命令:

ln -s out/ohos_config.json

四、参考链接

  1. OpenHarmony官网: https://www.openharmony.cn/
  2. OpenHarmony编译形态整体说明: https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/quick-start/quickstart-appendix-compiledform.md
  3. OpenHarmony代码仓: https://gitee.com/openharmony/
  4. OpenHarmony riscv32_virt说明:https://gitee.com/openharmony/device_qemu/tree/HEAD/riscv32_virt
  5. GDB常用调试命令 — C/C++ Note 1.0.0 文档 (c-cpp-note.readthedocs.io)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能优化-02

uptime 依次显示当前时间、系统运行时间以及正在登录用户数,最后三个数字依次则是过去1分钟、5 分钟、15 分钟的平均负载(Load Average) 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数&#xf…

Vue3(四):Pinia

一、Pinia介绍 Pinia是一个专门为Vue.js设计的状态管理库,它提供了一种简单和直观的方式来管理应用程序的状态。在使用Pinia时,可以轻松地创建定义状态的存储,然后将其与Vue组件绑定,使它们能够使用该状态。和上一个博客提到的Vu…

【小程序】生成短信中可点击的链接

文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求,需要给用户发送炮轰短信,用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的,生成的倒是快速&#xf…

TVS参数、选型、对比

https://www.kdocs.cn/l/cpz6hHr7GRlh VRWM (Reverse working voltage) TVS 的最高工作电压,可连续施加不引起 TVS 劣化或损坏的最高工作峰值电压或直流峰值电压。 对于交流电压,用最高工作电压有效值表示,在VRWM 下&a…

科技助力上亿用户隐私安全保护,合合信息两款产品再获CCIA PIA星级标识

随着互联网技术的飞速发展,个人信息的收集、存储、使用和传输变得日益频繁,其泄露和滥用的风险也随之增加,个人信息保护已成为社会共同关注的热点议题。近期,“中国网络安全产业联盟(CCIA)数据安全工作委员…

【Windows】SecureCRT v9.2.3永久使用教程亲测可用

​ 软件介绍 SecureCRT 是一款常用的 SSH(安全外壳协议)和 Telnet 客户端软件,主要用于远程服务器管理和网络设备配置。它具有以下主要功能: 1.安全连接:SecureCRT 提供了强大的加密算法,保障用户与服务…

建立时间/保持时间为负是什么情况

目录 建立时间为负保持时间为负参考 在说明建立时间和保持时间为何为负的情况下,首先可以看看建立时间Tsu和保持时间Th的由来,可参考如下两篇文章: 建立时间和保持时间理解_为什么要满足建立时间和保持时间-CSDN博客 ic基础|时序篇&#xff…

GPT的使用

个人笔记(整理不易,有帮助点个赞) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 网站sms-activate.or…

Linux知识点(3)

文章目录 11. 进程间通信11.1 管道11.1.0 |11.1.1 匿名管道11.1.2 命名管道11.1.3 用匿名管道形成进程池 11.2 system V共享内存11.2.1 system V函数11.2.2 system 命令 11.3 system V消息队列11.4 system V 信号量 12. 进程信号12.1 前台进程和后台进程12.1.1 jobs12.1.2 fg &…

哈尔滨等保测评之什么是linux及快捷方式,看完这篇你还有什么不懂得嘛?

Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发,接触 Linux 机会相对较少,因此往往容易忽视它。但是学好它却是程序员必备修养之一。 什么是Linux Linux 系统内核与 Linux 发行套件的区别 Linux 系统内核指的是由 Linus Torva…

计算机网络(五)传输层

传输层 从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最低层 传输层功能: 传输层提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别区别是&#xf…

SSH客户端工具输入目标地址端口远程失败故障原因和解决方案

问题表现:SSH客户端工具输入目标地址端口远程失败时,出现ssh client 报 algorithm negotiation failed的异常信息。 使用SSH Secure Shell Client连接Linux服务器的SSH的时候有时会出现错误提示信息:ssh algorithm negotiation failed。这是…

ts文件用什么播放器?带您了解TS文件播放器的选择

ts文件用什么播放器?在数字多媒体时代,各种视频文件格式层出不穷,其中TS文件作为一种常见的视频封装格式,广泛应用于高清视频的制作与传输。然而,对于许多用户来说,如何选择合适的播放器来播放TS文件却是一…

Windows电脑使用Everything+cpolar搭建在线资料库并实现无公网IP管理文件

文章目录 推荐前言1.软件安装完成后,打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

算法——马尔可夫与隐马尔可夫模型

HMM(Hidden Markov Model)是一种统计模型,用来描述一个隐含未知量的马尔可夫过程(马尔可夫过程是一类随机过程,它的原始模型是马尔科夫链),它是结构最简单的动态贝叶斯网,是一种著名…

attention and tell论文【无标题】

这个公式使用LaTeX语法表示为: ( i t f t o t c t ) ( σ σ σ tanh ⁡ ) T D m n , n ( E y t − 1 h t − 1 x t ) \begin{pmatrix}i_t \\f_t \\o_t \\c_t\end{pmatrix} \begin{pmatrix}\sigma \\\sigma \\\sigma \\\tanh\end{pmatrix}T_{Dmn,n}\begin{pmatri…

内外网文件摆渡系统,如何贯通网络两侧被隔断的工作流?

随着业务范围不断扩大,产生的数据体量越来越多,企业会采取网络隔离,对核心数据进行保护。网络隔离主要目的是保护企业内部的敏感数据和系统不受外部网络攻击的风险,可以通过物理或逻辑方式实现,例如使用防火墙、网闸、…

Day13-Python基础学习之数据分析案例

数据分析案例 data_define.py # 数据定义的类 class Record:def __init__(self, date, order_id, money, province):self.date dateself.order_id order_idself.money moneyself.province province ​def __str__(self):return f"{self.date}, {self.order_id}, {se…

数学基础:深度学习的语言

数学基础:深度学习的语言 概述 在深度学习的世界里,数学不仅仅是一套工具,它是构建、理解和优化深度学习模型的基石。从向量空间的概念到复杂的优化算法,数学的每一个分支都在深度学习的发展中扮演着关键角色。本文的目标是通过深…

【前端面试3+1】17 伪类和伪元素的区别、CSS权重、图片显示优化、【二叉树最大深度】

一、伪类和伪元素的区别 1、伪类: 伪类是用来描述元素的特定状态的选择器,比如:hover、:active、:first-child等。伪类在选择器中以冒号(:)开头,用于匹配处于特定状态的元素。伪类可以用于选择DOM元素的特定状态&#…