环境介绍,本人使用M1Pro芯片的Macbook,采用orbstack运行x86的Ubuntu22.04容器。
工具链
根据官网介绍(一般在顶部导航栏的Labs下面的tools里面),选择Ubuntu的安装命令,一键安装。
SSH到Orb容器
在VSCode上连接到容器,没什么难点,略过。
安装插件
Clangd(可选项)
这里提醒一下,使用arm版linux的小伙伴可能无法从软件库找到clangd,所以直接在vscode上安装插件实际上是安装不了的,请在shell里面手动安装
sudo apt install clangd
这样的话,clangd就被成功配置了。但是我们随便点开一个文件,比如user/sleep.c
,会发现很多地方都爆红。那是因为clangd找不到标准库和xv6
的库,需要用compile_commands.json
文件来指明,可以用bear
包来自动生成。
安装bear
sudo apt install bear
接着我们来到xv6的目录下,运行
bear -- make qemu
即可。现在clangd可以自由的跳转,而且函数也不会爆红了。
因为clangd运行的时候会在xv6根目录生成一个.cache文件,看不顺眼,所以后来我没用了。
C/C++
这个插件是用于debug和语法提示的(clangd和C/C++的语法提示只能二选一)的,因为网络上的教程大多都是用这个插件,所以咱也不知道能不能用CodeLLDB来debug,姑且就用这个插件
首先在VSCode里面安装这个插件(armlinux的同学可能找不到,所以这就是为什么我直接运行的x86容器)。安装完了之后进行配置,在xv6根目录下创建一个.vscode
目录,再往里面添加两个文件,launch.json
和tasks.json
,接下来,我们讲进行这两个文件的配置
首先在xv6根目录用shell运行
make qemu-gdb
这时候你会发现目录下多了一个.gdbinit
的文件,里面内容大概如下
set confirm off
set architecture riscv:rv64
target remote 127.0.0.1:25000
symbol-file kernel/kernel
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes
我们记下target remote 127.0.0.1:xxxxx后面的端口号,你的可能和我不一样,接着将这行注释掉
set confirm off
set architecture riscv:rv64
# target remote 127.0.0.1:25000
symbol-file kernel/kernel
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes
然后来到launch.json,将以下内容复制进去
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug xv6",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/kernel/kernel",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"miDebuggerServerAddress": "127.0.0.1:25000",
"miDebuggerPath": "/usr/bin/gdb-multiarch",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "xv6-build",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true,
},
//在这里加载了寄存器信息表
{
"text": "set tdesc filename Debug.xml",
}
]
}
],
}
来到tasks.json,复制进去
{
"version": "2.0.0",
"tasks": [
{
"label": "xv6-build",
"type": "shell",
"isBackground": true,
"command": "make qemu-gdb",
"problemMatcher": [
{
"pattern": [
{
"regexp": ".",
"file": 1,
"location": 2,
"message": 3
}
],
"background": {
"beginsPattern": ".*Now run 'gdb' in another window.",
"endsPattern": "."
}
}
]
}
]
}
然后我们到debug页面,点击运行Debug xv6
即可实现debug。
注意1:如果make clean后再按F5(它会执行make qemu-gdb),.gdbinit
这个文件会被刷新,所以我们又要去注释掉target remote那行,然后再按F5,目前我还没找到更好的解决方法。
注意2:由于xv6默认多核运行,所以调试代码的时候可能会有点混乱,可以通过修改tasks.json
中command
字段为make qemu-gdb CPUS=1
,即单核运行。这仅供调试使用,因为正常情况下代码要通过多核的运行。
调试实战
我们在Lab中要编写用户程序,因此下面介绍如何调试(以user/ls.c文件为例)。
STEP1:在user/ls.c中main函数的某一行打上断点
STEP2:按F5进入调试模式,点击 调试控制台 输入:-exec file ./user/_ls
STEP3:点击调试工具的运行按钮,并在终端输入ls命令
然后VSCode会自动停在断点处,我们就可以对其进行调试了。