【开源鸿蒙】调试 OpenHarmony 轻量系统 QEMU RISC-V 版本
一、准备工作
前面几篇系列文章介绍了如何下载 OpenHarmony 4.1 Release 源代码,以及如何编译 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 文件了,使用如下命令:
执行上述命令后,终端输出如下:
此时,先不要在终端进行操作,等待后续的 GDB 调试器启动。
2.2 启动 GDB 调试器
另外打开一个终端窗口,使用如下命令:
执行上述命令后,终端输出如下:
此时,gdb 调试器已经成功启动,从终端的输出中,可以看到 gdb 已经成功加载了符号信息。
2.3 连接 QEMU 模拟器
在刚刚启动的 gdb 会话中,输入如下命令:
执行上述命令后,gdb 输出如下:
此时,gdb 已经连接到另外一个终端的 QEMU 模拟器了。
2.4 使用 GDB 进行断点调试
在 gdb 调试器中,我们输入命令:
即可查看 main 函数开始处的代码:
回车可以继续查看后面的代码,这里不再展示。
使用如下命令,添加断点:
这个命令将会在 main 函数开始处添加一个断点。
添加完断点后,执行如下命令:
这里的 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,执行命令:
四、参考链接
OpenHarmony 官网: https://www.openharmony.cn/
OpenHarmony 编译形态整体说明: https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/quick-start/quickstart-appendix-compiledform.md
OpenHarmony 代码仓: https://gitee.com/openharmony/
OpenHarmony riscv32_virt 说明:https://gitee.com/openharmony/device_qemu/tree/HEAD/riscv32_virt
版权声明: 本文为 InfoQ 作者【码匠许师傅】的原创文章。
原文链接:【http://xie.infoq.cn/article/df4b235f1d0649bf78590a1fe】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论