- 运行一遍 rCore-Tutorial-Code-2023S ch9
- 根据这 个diff 文件修 改代码,然后进入 user 目录,根据这 个diff 文件修 改代码,然后再跑一遍,确保能正常运行
- 下载 SiFive 提供 的risc-v 工具链。 下载后将该文件复制到 home 目录下并解压. 将其中的 bin/文件夹加入环境变量.
cd ..../your_dir/ && git clone https://github.com/chenzhiy2001/code-debug.git && cd code-debug/ && npm install
(确保您已经安装了较新版本的 npm)- 打开 vscode,打开 your_dir/code-debug/文件夹.
- 切换到
br-chenzhiy2001-hardcode-for-2023S
分支,然后将 code-debug/src/frontend/extension.ts 中的 16 行改成您要 debug 的 rCore 的位置,比如 os.homedir() + "/rCore-Tutorial-Code-2023S", 再npm install
.- 如果您不想这么做,而是想留在
master
分支,那么请参照这里.
- 如果您不想这么做,而是想留在
- 保存,然后按 f5,会弹出一个新的 vscode 窗口. 在新窗口中打开 rCore-Tutorial-Code-2023S/
- 在 .vscode 文件夹中添加 launch.json 文件,并输入以下内容(注意有三
处
${userHome}/your/path/to/rCore-Tutorial-Code-2023S
要修改成你的 rCore 的位置),保存后再编译运 行一遍 rCore,然后按 F5 就可以启动 gdb 并调试。//launch.json { "version": "0.2.0", "configurations": [ { "type": "gdb", "request": "launch", "name": "Attach to Qemu", "executable": "${userHome}/your/path/to/rCore-Tutorial-Code-2023S/os/target/riscv64gc-unknown-none-elf/release/os", //修改${userHome}/your/path/to/ "target": ":1234", "remote": true, "cwd": "${workspaceRoot}", "valuesFormatting": "parseText", "gdbpath": "riscv64-unknown-elf-gdb", //如果GDB并没有正常启动,可以尝试改成绝对路径(如“/home/username/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin”) "showDevDebugOutput":true, "internalConsoleOptions": "openOnSessionStart", "printCalls": true, "stopAtConnect": true, "qemuPath": "qemu-system-riscv64", "qemuArgs": [ "-M", "128m", "-machine", "virt", "-bios", "${userHome}/your/path/to/rCore-Tutorial-Code-2023S/bootloader/rustsbi-qemu.bin",//修改${userHome}/your/path/to/ "-display", "none", "-device", "loader,file=${userHome}/your/path/to/rCore-Tutorial-Code-2023S/os/target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000",//修改${userHome}/your/path/to/ "-drive", "file=${userHome}/your/path/to/rCore-Tutorial-Code-2023S/user/target/riscv64gc-unknown-none-elf/release/fs.img,if=none,format=raw,id=x0",//修改${userHome}/your/path/to/ "-device", "virtio-blk-device,drive=x0", "-device", "virtio-gpu-device", "-device", "virtio-keyboard-device", "-device", "virtio-mouse-device", "-serial", "stdio", "-s", "-S" ] }, ] }
- 等一会,喝杯水,直到 DEBUG CONSOLE 不再刷新内容
- 按 TERMINAL 可以切换到终端输出
- 按下清除所有断点(
removeAllCliBreakpoints
)按钮,在右上角,🗑 垃圾桶图标 - 按下设置内核入口(
setKernelInBreakpoints
)按钮 - 按下出口断点(
setKernelOutBreakpoints
)按钮 - 设置你想要的内核代码和用户程序代码的断点(推荐在 main.rs 的
trap::init()
设置一个,在 ch9b_initproc.rs 的println!("aaaa")
语句设置一个,如果不行的话设置在fn main() -> i32 {
处) - 按 continue 按钮(
|▷
)开始运行 rCore-Tutorial.接下来不停按|▷
就行了.- 当运行到位于内核出口的断点时,插件会自动切换到用户态的断点
- 在用户态程序中如果想观察内核内的执行流,可以点击
gotokernel
按钮,然后点击继续按钮,程序会停在 内核的入口断点,这时,可以先把内核出口断点设置好(点击setKernelOutBreakpoints
按钮),接下来 ,可以在内核态设置断点,点击继续,运行到内核的出口断点之后,会回到用户态。
改成一个 vscode 设置选项可能更方便,欢迎 pr:
- code-debug/src/mibase.ts
- 1255 行,65 改成 79
- 1264 行和 343 行,135 改成 148
- 1281 行,30 改成 43
- code-debug/src/frontend/extension.ts
- 15 行 initproc 改成 ch9b_initproc
- 16 行改成您要 debug 的 rCore 的位置,比如 os.homedir() + "/rCore-Tutorial-Code-2023S"