ARMv8-A MacOS调试环境搭建

文章目录

简介

本节主要介绍基于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:

c 复制代码
ARMGNU ?= aarch64-elf-

board ?= rpi4

ifeq ($(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进行调试,需要添加调试配置,具体可以参考微软官方说明

json 复制代码
{
    // 使用 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提供的JLinkGDBServer 连接树莓派,然后再通过修改 VSCode 的配置连接到 JLinkGDBServer 提供的端口,即可进行调试。

如果有使用过JLinkGDBServer 调试单片机的经历,一定会觉得这个过程很熟悉,单片机开发主要基于芯片本身进行,运行的程序本身并不支持完整的gdb服务,大部分时候都需要通过调试器对硬件进行调试。

不同于Linux应用调试,Linux应用程序可以通过在树莓派安装一个gdbserver对应用程序进行调试,所有的功能由Linux系统提供,而在ARMv8架构学习过程中,编写的代码相当于是一段裸机程序,它并没有Linux系统的支持,一旦出现故障需要进行排查时,使用调试器是一个非常高效的调试方式。

相关推荐
m0_748234713 小时前
【大模型】Ollama+open-webuiAnything LLM部署本地大模型构建RAG个人知识库教程(Mac)
人工智能·macos
qq_207518516 小时前
MacBook Pro触控板按不动解决方法
经验分享·macos·电脑·笔记本电脑
嘟嘟实验室6 小时前
PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)
人工智能·macos·aigc·自动翻译
符小易7 小时前
Mac上安装illustrator 2025/2024总是提示130/131/已损坏等解决方法
macos·ui·illustrator
半夏知半秋10 小时前
unity打包流程整理-Windows/Mac/Linux平台
windows·笔记·学习·macos·unity·游戏引擎
牛奔10 小时前
解决 Mac(M1/M2)芯片,使用node 14版本
linux·macos·编辑器·vim
樱木之11 小时前
mac删除程序坞(Dock)中“无法打开的程序“
macos
丁总学Java12 小时前
Mac备忘录表格中换行(`Option` + `Return`(回车键))
macos
weixin_4978455414 小时前
.NET MAUI开发的安卓、iOS软件和Java开发的安卓和Swift开发的iOS的区别
macos·objective-c·cocoa
草明14 小时前
ios 开发配置蓝牙
macos·ios·cocoa