vscode+ubuntu22
ubuntu远程环境
1.安装必要依赖,保证xv6-riscv项目可以运行
这步比较容易
安装gdb调试工具
从以下网址下载,上传到远程Ubuntu主机
https://github.com/sifive/freedom-tools/releases
https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
然后:
sudo mkdir -p /opt/riscv
sudo tar -xzf riscv64-unknown-elf-toolchain-*.tar.gz -C /opt/riscv --strip-components=1
echo 'export PATH=/opt/riscv/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
验证安装
riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gdb --version
xv6文件改动
.gdbinit.tmpl-riscv,原始
set confirm off
set architecture riscv:rv64
target remote 127.0.0.1:1234
symbol-file kernel/kernel
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes
去掉第三行和第四行,修改为:
set confirm off
set architecture riscv:rv64
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes
如果是阿里云主机,勿忘防火墙放行25000端口或者26000端口
vscode的C/C++ (by Microsoft)插件也需要安装到远程ubuntu主机上
windows+vscode端
本地 VSCode 必备插件
在 VSCode 安装:
- ✅ Remote - SSH
- ✅ C/C++ (by Microsoft)
- ✅ CodeLLDB(可选)
- ✅ Native Debug(可选)
远程打开 xv6 项目(把远程的xv6项目同步到本地)
-
在 VSCode 打开命令面板(Ctrl+Shift+P)
-
选择:
Remote-SSH: Connect to Host... -
连接你的云主机。
-
打开
xv6-riscv项目所在目录。
在 VSCode 中创建调试配置
在项目根目录创建(或编辑) .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "debug xv6",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/kernel/kernel",
// "program": "${workspaceFolder}/user/_ls",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"miDebuggerServerAddress": "localhost:25000",
"miDebuggerPath": "/opt/riscv/bin/riscv64-unknown-elf-gdb",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "pretty printing",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"logging": {
// "engineLogging": true,
// "programOutput": true,
}
}
]
}
如果想要调试内核则:
"program": "${workspaceFolder}/kernel/kernel",
如果想要调试用户程序则:
"program": "${workspaceFolder}/user/_ls",
调试流程
-
在 VSCode 中,终端执行:
make clean make qemu-gdb让 QEMU 进入等待调试状态。
-
在 VSCode "运行与调试"面板选择:
Debug xv6 (remote QEMU)然后点 ▶️ 启动调试。
-
在
main.c或trap.c等地方设置断点。 -
现在你可以:
- 单步执行(F10 / F11)
- 查看寄存器、堆栈
- 调用栈浏览
参考
https://www.cnblogs.com/KatyuMarisaBlog/p/13727565.html
https://karthikv1392.github.io/cs3301_osn/slides/Tutorials/xv6_debug_vscode.pdf
调试技巧
可以先单cpu运行,修改makefile
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 1 -nographic
可以不启动时钟中断,kernel/start.c
// timerinit(); // 注释掉或暂时禁用
mkfs.c的调试
在图形界面的ubuntu宿主机上安装vscode,并打开xv6项目。
配置.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug mkfs",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/mkfs/mkfs",
"args": ["fs.img",
"user/_init",
"user/_sh",
"user/_cat",
"user/_echo",
"user/_ls"],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
修改makefile(加了-g选项,生成调试符号表)
mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h
gcc -Wno-unknown-attributes -I. -o mkfs/mkfs mkfs/mkfs.c
为
mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h
gcc -Wno-unknown-attributes -g -I. -o mkfs/mkfs mkfs/mkfs.c
运行make qemu编译
然后在vscode中启动调试。
mkfs.c的作用
使用宿主机即linux文件系统调用生成xv6格式的文件系统fs.img,并将所有的用户程序写入。然后qemu将其模拟成一个块设备。
然后内核启动后,通过virtio-blk driver(bio.c,virtio_disk.c),读写fs.img
qemu-system-riscv64 -drive file=fs.img,format=raw