写点什么

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

作者:码匠许师傅
  • 2024-09-13
    江苏
  • 本文字数:1718 字

    阅读完需:约 6 分钟

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

一、准备工作

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


1.1 编译 OpenHarmony 源码

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


构建完成后,输出如下:


1.2 确认 OHOS_Image 已生成

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



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

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

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


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



输出带有 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
复制代码


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



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

2.2 启动 GDB 调试器

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


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


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



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

2.3 连接 QEMU 模拟器

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


target remote localhost:1234
复制代码


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



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

2.4 使用 GDB 进行断点调试

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


l main
复制代码


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



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


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


b main
复制代码


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


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


c
复制代码


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


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



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


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



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



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

三、问题解决

3.1 找不到 ohos_config.json

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



【直接原因】因为 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)

发布于: 刚刚阅读数: 5
用户头像

软件工程师,开源爱好者 2018-10-02 加入

擅长物联网相关技术;热爱折腾各种开源软件和开源硬件。 曾获称号: 华为开发者专家(HDE); 电子发烧友最有价值专家(MVP); 51CTO最有价值专家(MVP); OpenHarmony第20位开发者; OpenHarmony开发者贡献奖

评论

发布
暂无评论
【开源鸿蒙】调试OpenHarmony轻量系统QEMU RISC-V版本_gdb_码匠许师傅_InfoQ写作社区