6.s081 lab0准备

lab0

环境

WSL2 Ubuntu20.04 ,xv6-labs-2020

# qemu版本
lhz@lhz:~/os/xv6-labs-2020$ qemu-system-riscv64 --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.30)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

#debug工具版本
lhz@lhz:~/os/xv6-labs-2020$ riscv64-unknown-elf-gdb --version
GNU gdb (GDB) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.

启动

## 进入 xv6-labs-2020 根目录
make clean && make qemu

debug

GDB

GDB 对进行kernel debug

打开第一个窗口,作为操作系统的页面

## 进入 xv6-labs-2020 根目录
make clean && make qemu-gdb
#可以限制CPU核心数量
 make qemu-gdb CPUS=1

image-20231113114233452

打开第二个窗口,作为DEBUG信息页面

## 打开另一个窗口 debug
riscv64-unknown-elf-gdb kernel/kernel
#打一个断点
b main
#连接端口 debug
target remote localhost:26000

image-20231113114233452

交互页面

image-20231113114233452

安装依赖:

如果缺少 riscv64-unknown-elf-gdb,安装 riscv64-unknown-elf-gdb 步骤(用于调试 裸机(bare-metal)或嵌入式 RISC-V 系统程序,不依赖操作系统。QEMU 模拟的裸机环境)

  1. 安装依赖
sudo apt-get install libncurses5-dev python python-dev texinfo libreadline-dev
sudo apt install libgmp-dev
  1. 下载gdb-9.2.tar.gz安装包,注意此处不能下载最新版本gdb13的安装包,会显示与python版本不匹配

​ 下载地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/?C=M&O=D

  1. 执行以下命令
tar -zxvf gdb-9.2.tar.gz

cd gdb-9.2

mkdir build

cd build

../configure --prefix=/usr/local --with-python=/usr/bin/python --target=riscv64-unknown-elf --enable-tui=yes

  1. 编译安装
make clean
make -j$(nproc)
sudo make install
#可选)安装 gdb-dashboard 插件,优化 debug 体验
wget -P ~ https://git.io/.gdbinit

VScode Debug

  1. xv6-labs-2020目录下新建.vscode 目录

  2. 找到gdb工具位置

    1. linux服务器输入命令 whereis riscv64-unknown-elf-gdb
      1. image-20231113114233452
  3. .vscode目录下新建launch.json文件

    1. {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "debug xv6",
                  "type": "cppdbg",
                  "request": "launch",
                  "program": "${workspaceFolder}/kernel/kernel",
                  "args": [],
                  "stopAtEntry": true,
                  "cwd": "${workspaceFolder}",
                  "miDebuggerServerAddress": "localhost:26000",
                  "miDebuggerPath": "/usr/local/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,
                  }
              }
          ]
      }
      
    2. 也可以再创建一个task.json,前置任务,就不需要单独打开一个控制台了

      {
          "version": "2.0.0",
          "tasks": [
            {
              "label": "xv6build",
              "type": "shell",
              "isBackground": true,
              "command": "make qemu-gdb CPUS=1",
              "problemMatcher": [
                {
                  "pattern": [
                    {
                      "regexp": ".",
                      "file": 1,
                      "location": 2,
                      "message": 3
                    }
                  ],
                  "background": {
                      // 要对应编译成功后,一句echo的内容. 此处对应 Makefile Line:170
                    "beginsPattern": ".*Now run 'gdb' in another window.",
                    "endsPattern": "."
                  }
                }
              ]
            }
          ]
        }
      
  4. 打开第一个窗口,作为操作系统的页面输入命令 make qemu-gdb CPUS=1

    1. image-20231113114233452
  5. xv6根目录会自动新增一个gdbinit文件,把文件里的target remote 127.0.0.1:26000行删除。

    1. image-20231113114233452
  6. 点击vscode debug按钮选择debug xv6的,即可在编辑器上操作

    1. image-20231113114233452
    2. image-20231113114233452

如何显示寄存器 信息

上图VScode左侧是看不到寄存器的,需要额外操作来完善

首先升级gdb,Ubuntu20.04 默认最高是9,需要升级到12

手动编译 升级GDB 12
  1. 安装依赖

    sudo apt update
    sudo apt install -y build-essential texinfo libgmp-dev libmpfr-dev libmpc-dev libisl-dev
    
  2. 下载 GDB 12 源码

    wget https://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz
    tar -xf gdb-12.1.tar.xz
    cd gdb-12.1
    
  3. 配置和编译

    mkdir build
    cd build
    ../configure --prefix=/opt/gdb-12
    make -j$(nproc)
    sudo make install
    
  4. 切换新版 GDB

    #找到老版本gdb位置
    which gdb
    /usr/bin/gdb
       
    #找到新版本gdb位置
    whereis gdb
    gdb: /usr/bin/gdb  /opt/gdb-12/bin/gdb
       
    #替换,把环境变量的gdb换成 /opt/gdb-12/bin/gdb
    sudo ln -sf /opt/gdb-12/bin/gdb /usr/local/bin/gdb
       
    #检查版本
    gdb --version
    

    image-20231113114233452

    由于之前的riscv64-unknown-elf-gdb是使用gdb9编译出来的,所以需使用新版GDB12编译 riscv64-unknown-elf-gdb
    #1.进入新版GDB目录
    cd gdb-12.1
       
    # 2. 新建构建目录
    mkdir build-riscv
    cd build-riscv
       
    # 3. 配置编译目标为 riscv64-unknown-elf
    ../configure --prefix=/opt/riscv-gdb-12 --with-python=/usr/bin/python --target=riscv64-unknown-elf --enable-tui=yes
       
    # 4. 编译并安装
    make -j$(nproc)
    sudo make install
       
    #可以不用环境变量的riscv64-unknown-elf-gdb切换成新的,在vscode指定即可
    
    配置Vscode

    把launch.json里面gdb的换成新版的

    // "miDebuggerPath": "/usr/local/bin/riscv64-unknown-elf-gdb", 老版地址
    "miDebuggerPath": "/opt/riscv-gdb-12/bin/riscv64-unknown-elf-gdb",
    

    然后

    F5 debug模式下运行情况下在调试控制台中输入-exec maintenance print xml-tdesc,把内容粘贴在我们创建的mymxl.xml

    image-20231113114233452

    把launch.json指定mymxl.xml

    gdb-5

    最终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:26000",
            //"miDebuggerPath": "/usr/local/bin/riscv64-unknown-elf-gdb",
            "miDebuggerPath": "/opt/riscv-gdb-12/bin/riscv64-unknown-elf-gdb",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "preLaunchTask": "xv6build",
            "setupCommands": [
              {
                "description": "pretty printing",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
              },
               //在这里加载了寄存器信息表
              {
                "text": "set tdesc filename myxml.xml"
              }
            ]
          }
        ]
    }
    

    完美出现所有寄存器

    gdb-4