6.S081|实验环境搭建

环境介绍,本人使用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.jsontasks.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.jsoncommand字段为make qemu-gdb CPUS=1,即单核运行。这仅供调试使用,因为正常情况下代码要通过多核的运行。

调试实战

我们在Lab中要编写用户程序,因此下面介绍如何调试(以user/ls.c文件为例)。

STEP1:在user/ls.c中main函数的某一行打上断点

STEP2:按F5进入调试模式,点击 调试控制台 输入:-exec file ./user/_ls

STEP3:点击调试工具的运行按钮,并在终端输入ls命令

然后VSCode会自动停在断点处,我们就可以对其进行调试了。


参考文章:

1.515code-MIT6.S081操作系统学习记录

2.ZiXiang-在 VSCode 中调试 xv6

3.优雅的调试—在vscode上完美调试xv6(完结)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇