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

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

一、准备工作

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

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)
### 在QEMU中安装和配置RISC-V操作系统 #### 准备工作 为了能够在QEMU环境中成功运行RISC-V架构上的Linux系统,需要先准备好必要的资源文件。这通常包括获取适用于目标架构的预编译二进制镜像或者自行构建所需的内核与根文件系统[^1]。 对于希望快速入门的用户来说,可以从官方渠道或者其他可信来源下载现成的RISC-V Linux发行版ISO或磁盘映像文件;而对于更深入的学习者,则可能倾向于自己动手编译定制化的Kernel以及创建合适的rootfs(root file system),以便更好地理解整个过程并满足特殊需求[^2]。 #### 安装依赖项 在开始之前,请确认主机已经安装了所有必需的库和支持工具。例如,在某些情况下可能会遇到`glib-2.48 gthread-2.0 is required to compile QEMU`这样的报错提示,这时就需要按照相关文档指引去解决依赖关系问题,确保能够顺利完成后续步骤中的配置命令执行[^3]。 #### 配置与启动虚拟机实例 完成上述准备工作之后,接下来就是设置具体的参数选项来定义新创建出来的VM(Virtual Machine)特性——比如指定处理器型号(-cpu rv64),分配内存大小(-m 1G)等,并加载先前准备好的OS image作为启动介质。下面给出了一段用于启动基于RISC-V架构的最小化Linux系统的典型命令行: ```bash qemu-system-riscv64 \ -machine virt \ -nographic \ -smp 4 \ -m 1G \ -bios none \ -kernel /path/to/vmlinux \ -append "console=ttyS0 root=/dev/vda rw" \ -drive file=/path/to/rootfs.img,format=raw,id=rootfs \ -device virtio-blk-device,drive=rootfs,bus=virtio-mmio-bus.0 ``` 此脚本片段展示了如何利用QEMU模拟器来引导一个带有virtio驱动支持的标准block device(块设备),并通过串口输出日志信息给终端显示出来。其中涉及到了几个重要的组成部分:一是指定了要使用的内核路径(`-kernel`);二是设定了初始挂载点及其对应的存储后端(`-drive`);三是附加了一些传递给bootloader/kernel的关键参数字符串(`-append`)[^1]。 #### 后续操作指南 一旦进入了shell界面,就意味着基本环境搭建完毕。此时可以根据实际情况进一步调整网络连接方式、安装额外的应用程序包或是开展其他形式的研究活动。值得注意的是,由于这是一个纯软件层面仿真的解决方案,因此性能表现或许无法完全媲美真实的物理机器,但在学习和技术验证方面依然具有不可替代的价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码工许师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值