riscv64-unknown-elf-gdb
和 gdb-multiarch
都是用于调试多种架构的 GDB 变体。它们的主要区别在于目标架构和使用方式。
riscv64-unknown-elf-gdb
:- 这是 RISC-V 架构的特定 GDB 变体。它被用于调试 RISC-V 架构的程序,特别是使用 RISC-V 指令集的嵌入式系统或裸机程序。
riscv64-unknown-elf
部分表示目标架构为 RISC-V 64 位,gdb
部分表示它是 GNU Debugger 的一个版本。
gdb-multiarch
:- 这是一个通用的 GDB 变体,设计用于支持多种架构的调试。它可以用于调试多种不同的架构,而不仅仅是 RISC-V。
multiarch
表示它支持多种不同的架构,而不是专门针对某个特定的架构。
现在更为主流的是使用gdb-multiarch
。
该xv6版本使用gdb-multiarch
会导致无法跟踪ecall
进入kernel。因此需要使用riscv64-unknown-elf-gdb
,且该gdb
在安装riscv64 toolchain
时默认没有安装,需要自己下载源码编译安装。
在此记录一下安装时的一些坑:
Linux环境:Ubuntu20.04
# 安装相关依赖
sudo apt-get install libncurses5-dev python2 python2-dev texinfo libreadline-dev
# 从清华大学开源镜像站下载gdb源码(约23MB)
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/gdb-13.1.tar.xz
# 解压gdb源码压缩包
tar -xvf gdb-13.1.tar.xz
# 进入gdb源码目录
cd gdb-13.1
mkdir build && cd build
# 配置编译选项,这里只编译riscv64-unknown-elf一个目标文件
../configure --prefix=/usr/local --target=riscv64-unknown-elf --enable-tui=yes
# 在上面一行编译配置选项中,很多其他的文章会配置一个python选项
# 但我在尝试中发现配置了python选项后后面的编译过程会报错,不添加python选项则没有问题
# 开始编译,这里编译可能消耗较长时间,具体时长取决于机器性能
make -j$(nproc)
# 编译完成后进行安装
sudo make install
完成上面的编译安装步骤后,在命令行执行riscv64-unknown-elf-gdb -v
检查是否安装完成(若正确输出版本信息则说明已经完成安装)。
出现问题:make -j$(nproc)
后编译报错:
configure: error: GMP is missing or unusable make[1]: *** [Makefile:11803: configure-gdb] Error 1
解决方法:
确保安装了libgmp-dev
执行sudo apt-get install libgmp-dev
后成功编译。
最终gdb
调试成功跟踪ecall
进入kernel
: