文章目录
- 简介
- 安装
- qemu
- 交叉编译工具链
- C语言插件
- gdb调试
- 测试代码
- 添加调试配置
- JLink 调试树莓派
简介
本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建,Linux发行版上的过程也类型,它主要使用到以下工具链:
- aarch64 架构的交叉编译器和gdb客户端
- Visual Studio Code 和 C语言插件
- qemu
安装
qemu
brew install qemu
交叉编译工具链
学习ARMv8架构不同于编写Linux应用程序,过程中并不涉及使用glibc,可以使用不带glibc的版本,安装途径如下:
- 使用 brew 安装 aarch64-elf-gcc 和 aarch64-elf-gdb
brew install aarch64-elf-gcc aarch64-elf-gdb
- 通过ARM官方网站下载 aarch64-none-elf,ARM官方只提供了aarch64-none-elf 的 MacOS 版本,Linux 发行版可以选择 aarch64-none-linux-gnu。
- 使用其他版本的工具链,例如 zephyr 的 sdk 中已经包含了aarch64架构的交叉编译器,这些编译器也可以用。
C语言插件
在VSCode中直接搜索C相关的插件,这些插件包含了C语言语法解析以及调试支持:
gdb调试
测试代码
首先需要编写编写一段程序,并将其编译成elf文件,最后使用qemu运行该程序,此处的示例使用笨叔的ARMv8练手程序,需要根据自己所使用的编译器版本修改编译器前缀,例如我所使用的编译器需要将前缀改为aarch64-elf-,除此之外还需要修改qemu所使用的目标机,新版本的 qemu 的目标名称从 raspi4 变成了 raspi4b:
ARMGNU ?= aarch64-elf-board ?= rpi4ifeq ($(board), rpi3)
COPS += -DCONFIG_BOARD_PI3B
QEMU_FLAGS += -machine raspi3b
else ifeq ($(board), rpi4)
COPS += -DCONFIG_BOARD_PI4B
QEMU_FLAGS += -machine raspi4b
endif
修改完成之后先执行 make 编译出可执行程序,然后再执行make debug,等待gdb客户端连接。
添加调试配置
在VSCode上如果需要使用gdb进行调试,需要添加调试配置,具体可以参考微软官方说明
{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "armv8-launch","type": "cppdbg","request": "launch","program": "xxx.elf","args": [],"stopAtEntry": true,"cwd": "${workspaceRoot}","environment": [],"externalConsole": true,"MIMode": "gdb","miDebuggerPath": "aarch64-elf-gdb","miDebuggerServerAddress": "localhost:1234"}]
}
添加完成后会在左侧debug菜单下显示新增的调试选项,点击该选项即可连接到qemu到gdb服务器中。
JLink 调试树莓派
当我们想使用JLink调试树莓派或者其他芯片时,可以使用JLink提供的JLinkGDBServer 连接树莓派,然后再通过修改 VSCode 的配置连接到 JLinkGDBServer 提供的端口,即可进行调试。
如果有使用过JLinkGDBServer 调试单片机的经历,一定会觉得这个过程很熟悉,单片机开发主要基于芯片本身进行,运行的程序本身并不支持完整的gdb服务,大部分时候都需要通过调试器对硬件进行调试。
不同于Linux应用调试,Linux应用程序可以通过在树莓派安装一个gdbserver对应用程序进行调试,所有的功能由Linux系统提供,而在ARMv8架构学习过程中,编写的代码相当于是一段裸机程序,它并没有Linux系统的支持,一旦出现故障需要进行排查时,使用调试器是一个非常高效的调试方式。