GDB调试xv6
安装调试工具
- 根据系统安装gdb
我安装的是
sudo apt install gdb-multiarch
- 安装RISC-V工具链
-
汇编:把人类可读的汇编代码翻译成机器能执行的二进制指令(机器码)。
-
反汇编:把编译后的二进制指令还原成汇编代码,供人类阅读和调试。
反汇编的目的就是为了_看到每条指令的地址和对应的汇编代码_
sudo apt install binutils-riscv64-unknown-elf gcc-riscv64-unknown-elf
要对 write 进行断点调试
就需要先知道 write 那个系统调用的地址
所以用 objdump -d 反汇编,查找 ecall 指令出现的位置(或者跟 write 相关的函数位置)
调试步骤
make qemu-gdb
- 加载内核
gdb-multiarch kernel/kernel
target remote :25000
- 查找需要打断点的地址 也就是对响应指令进行反汇编
riscv64-unknown-elf-objdump -d user/_sh > user/sh.asm
- 用通配符匹配:
grep -A 20 "write>:" user/sh.asm
检验:
(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