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

打开第二个窗口,作为DEBUG信息页面
## 打开另一个窗口 debug
riscv64-unknown-elf-gdb kernel/kernel
#打一个断点
b main
#连接端口 debug
target remote localhost:26000

交互页面

安装依赖:
如果缺少 riscv64-unknown-elf-gdb,安装 riscv64-unknown-elf-gdb 步骤(用于调试 裸机(bare-metal)或嵌入式 RISC-V 系统程序,不依赖操作系统。QEMU 模拟的裸机环境)
- 安装依赖
sudo apt-get install libncurses5-dev python python-dev texinfo libreadline-dev
sudo apt install libgmp-dev
- 下载gdb-9.2.tar.gz安装包,注意此处不能下载最新版本gdb13的安装包,会显示与python版本不匹配
下载地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/?C=M&O=D
- 执行以下命令
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
- 编译安装
make clean
make -j$(nproc)
sudo make install
#可选)安装 gdb-dashboard 插件,优化 debug 体验
wget -P ~ https://git.io/.gdbinit
VScode Debug
-
xv6-labs-2020目录下新建.vscode 目录
-
找到gdb工具位置
- linux服务器输入命令 whereis riscv64-unknown-elf-gdb
- linux服务器输入命令 whereis riscv64-unknown-elf-gdb
-
.vscode目录下新建launch.json文件
-
{ "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, } } ] } -
也可以再创建一个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": "." } } ] } ] }
-
-
打开第一个窗口,作为操作系统的页面输入命令 make qemu-gdb CPUS=1
-
在
xv6根目录会自动新增一个gdbinit文件,把文件里的target remote 127.0.0.1:26000行删除。 -
点击vscode debug按钮选择debug xv6的,即可在编辑器上操作
如何显示寄存器 信息
上图VScode左侧是看不到寄存器的,需要额外操作来完善
首先升级gdb,Ubuntu20.04 默认最高是9,需要升级到12
手动编译 升级GDB 12
-
安装依赖
sudo apt update sudo apt install -y build-essential texinfo libgmp-dev libmpfr-dev libmpc-dev libisl-dev -
下载 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 -
配置和编译
mkdir build cd build ../configure --prefix=/opt/gdb-12 make -j$(nproc) sudo make install -
切换新版 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
由于之前的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

把launch.json指定mymxl.xml

最终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" } ] } ] }完美出现所有寄存器




