安装调试工具

  1. 根据系统安装gdb

我安装的是

sudo apt install gdb-multiarch

  1. 安装RISC-V工具链
  • 汇编:把人类可读的汇编代码翻译成机器能执行的二进制指令(机器码)。

  • 反汇编:把编译后的二进制指令还原成汇编代码,供人类阅读和调试。

反汇编的目的就是为了_看到每条指令的地址和对应的汇编代码_

sudo apt install binutils-riscv64-unknown-elf gcc-riscv64-unknown-elf

要对 write 进行断点调试

就需要先知道 write 那个系统调用的地址

所以用 objdump -d 反汇编,查找 ecall 指令出现的位置(或者跟 write 相关的函数位置)

调试步骤

  1. make qemu-gdb
  2. 加载内核 gdb-multiarch kernel/kernel
  3. target remote :25000
  4. 查找需要打断点的地址 也就是对响应指令进行反汇编 riscv64-unknown-elf-objdump -d user/_sh > user/sh.asm
  5. 用通配符匹配: grep -A 20 "write>:" user/sh.asm
Image

检验:

(gdb) delete 1 (gdb) print $pc $1 = (void (*)()) 0xdea

打印寄存器信息

info reg

(gdb) x/2c $a1 0x3e9f: 36 '$' 48 '0'

查看satp寄存器

(gdb) print/x $satp $2 = 0x8000000000087f64