xv6をWSLにインストールしVisual Studio Codeでデバッグ

1.はじめに

VirtualBox上で動かすのは手間がかかるので、WSL上でxv6を動かします。

IDEを使ってソースの参照やデバッグができると便利なので、

Visual Studio Codeでソースを参照、ビルド、デバッグをできるようにします。

 

2.環境

 ホストOS:Windows 10 Pro

 ゲストOS:Ubuntu 18.04.3 LTS (Bionic Beaver)

 IDE:Visual Studio Code 1.40.1

 プラグイン:Remote - WSL, C/C++, Japanese Language Pack for VS Code

 ソースを置くディレクトリ:D:\develop\vscode\xv6

 

3.インストール

(1)環境準備

$ sudo apt-get update

$ sudo apt-get install build-essential

$ sudo apt-get install gcc-multilib

$ sudo apt-get install qemu

$ sudo apt-get install git

 

(2)ソースをダウンロード&コンパイル

$ cd /mnt/d/develop/vscode/xv6/

 

$ git clone git://github.com/mit-pdos/xv6-public.git

$ cd xv6-public/

$ make

$ make qemu-nox

⇒起動することを確認する。

 

4.Visual Studio Codeで参照、ビルド、デバッグ

4.1.参照

カレントディレクトリをプロジェクトとして開いて起動する。

$ code .

⇒Visual Studio Codeが起動する。

 

4.2.ビルド環境の準備

(1)tasks.jsonを準備

.vscode\tasks.jsonファイルを作り、下記の内容を記述する。

----------------------------------------------------------------

{

    "version": "2.0.0",

    "type":"shell",

    "echoCommand": true,

    "tasks": [

        {

            "label": "xv6 build",

            "command": "make",

            "problemMatcher": [

                "$gcc"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            }

        },

        {

            "label": "xv6 clean",

            "command": "make clean",

            "problemMatcher": [

                "$gcc"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            }

        },

 

        {

            "label": "xv6 run qemu-nox-gdb",

            "command": "make qemu-nox-gdb",

            "problemMatcher": [

                "$tsc"

            ],

        }

    ]

}

----------------------------------------------------------------

 

(2)ビルド

メニューで、「ターミナル」→「ビルドタスクの実行...」を選択する。

 

「実行するビルドタスクを選択」で、「xv6 clean」を選択する。

 

「実行するビルドタスクを選択」で、「xv6 build」を選択する。

→ビルドが正常に完了することを確認する。

 

4.3.デバッグ環境の準備

(1)launch.jsonを準備

.vscode\launch.jsonファイルを作り、下記の内容を記述する。

----------------------------------------------------------------

{

    "version": "0.2.0",

    "configurations": [

        {

            "name": "xv6 debug",

            "type": "cppdbg",

            "request": "launch",

            "program": "/mnt/d/develop/vscode/xv6/xv6-public/kernel",

            "miDebuggerServerAddress": "localhost:26000",

            "args": [],

            "stopAtEntry": false,

            "cwd": "${workspaceFolder}",

            "environment": [],

            "externalConsole": true,

            "MIMode": "gdb",

            "setupCommands": [

                {

                    "description": "Enable pretty-printing for gdb",

                    "text": "dir .",

                    "ignoreFailures": true

                }

            ]

        }

    ]

}

----------------------------------------------------------------

 

(2).gdbinitファイルの準備

元のファイルをバックアップする。

$ cp .gdbinit.tmpl -p .gdbinit.tmpl_org

 

テンプレートファイルを開き、リモートデバッグ部分を消す。

$ vi .gdbinit.tmpl

23行目、24行目の下記の記述を消して保存する。

----------------------------------------------------------------

echo + target remote localhost:1234\n

target remote localhost:1234

----------------------------------------------------------------

 

(3)デバッグ

①xv6を起動

メニューで、「ターミナル」→「タスクの実行」を選択する。

「実行するタスクを選択」で、「xv6 run qemu-nox-gdb」を選択する。

→下記の表示となり、デバッガの接続待ちとなる。

---------------------------------------------------------------

*** Now run 'gdb'.

qemu-system-i386 -nographic -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 -m 512  -S -gdb tcp::26000

---------------------------------------------------------------

 

②デバッガで接続

デバッグで「xv6 debug」を選択し、デバッガを実行する。

→接続が完了すると、ターミナルにxv6のプロンプトが表示される。

 

 

 

exec.c の 22行目にブレークポイントを指定して実行した画面です。

5.補足

プロセスへのアタッチが制限されている場合は下記のコマンドで一時的に解除する。

 

$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

 

写真素材のピクスタ