[MIT 6.S081] Lab 0: 实验配置, 调试及测试

Lab 0: 实验配置, 调试及测试

  • Lab Guide: Tools Used in 6.S081

环境

  • VMware Workstation 16 Pro
  • 操作系统: Ubuntu-20.04.3-desktop-amd64

实验配置

  1. 安装依赖:
$ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu 
  1. 安装特定版本 QEMU
$ sudo apt-get remove qemu-system-misc
$ sudo apt-get install qemu-system-misc=1:4.2-3ubuntu6
  • 注: 经过测试, 1:4.2-3ubuntu6 版本的 qemu-system-misc 软件包仅在 Ubuntu 20.04 发布, 因此建议使用此版本的 Ubuntu.
  1. 安装验证:
$ riscv64-unknown-elf-gcc --version
  • 发现问题: Command ‘riscv64-unknown-elf-gcc’ not found
    在这里插入图片描述
    解决: 使用命令:
$ sudo apt install gcc-riscv64-unknown-elf
$ qemu-system-riscv64 --version

验证结果:
[MIT 6.S081] Lab 0: 实验配置, 调试及测试_第1张图片

GDB 调试

安装

  • Ref: 使用 GDB 对 rCore 进行 debug - GitBook
    GDB 需要支持 riscv64 才能对 xv6 进行调试.
    运行如下指令来查看本地 GDB 支持的架构, 其中 --target 参数指定了 debug 的架构
$ gdb --configuration

[MIT 6.S081] Lab 0: 实验配置, 调试及测试_第2张图片
如图所示, 一般 Ubuntu 默认的 GDB 是不支持 riscv64 的, 因此需要安装 riscv64-unknown-elf-gdb.

  1. 安装依赖:
$ sudo apt-get install libncurses5-dev python python-dev texinfo libreadline-dev
  1. 前往清华镜像下载最新的 GDB 源代码
  2. 解压源代码,并定位到目录
  3. 执行以下命令
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local --with-python=/usr/bin/python --target=riscv64-unknown-elf --enable-tui=yes
  1. 编译安装
$ make -j$(nproc)

此处遇到问题: configure: error: GMP is missing or unusable
解决: 安装 GMP, 使用命令:

$ sudo apt install libgmp-dev
  1. 安装完成
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第3张图片
  2. riscv64-unknown-elf-gdb 初始化: 首先在一个终端构建 qemu-gdb(具体见下一部分); 打开另一终端在 xv6-labs-2020 目录下运行该 riscv64-unknown-elf-gdb, 会出现如下内容, 提示有文件自动加载, 但需要在 /home//.config/gdb/gdbinit 中添加上述行.
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第4张图片
    安装上述要求, 必要时创建 gdb 目录和 gdbinit 文件, 添加提示中指定的内容:
    在这里插入图片描述
  3. 完成上述操作后重新启动 GDB, 如下图所示, 会有 0x0000000000001000 in ?? () 显示, 表示设置成功.
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第5张图片

内核调试

  1. 创建一个终端, 构建 qemu-gdb:
$ make CPUS=1 qemu-gdb

此处使用 CPUS=1 表明只设置一个 CPU 核心活跃, 若不包含该参数也能正常调试, 但是多线程, 不是方便.
在这里插入图片描述
2. 新建一个终端, 运行 GBD:

$ riscv64-unknown-elf-gdb

[MIT 6.S081] Lab 0: 实验配置, 调试及测试_第6张图片
3. 之后可以正常调试, 如打断点 b main()
在这里插入图片描述

用户指令调试

  1. 创建两个终端, 一个构建 qemu-gdb, 一个打开 riscv64-unknown-elf-gdb.
  2. 在 gdb 中加载 user目录下可执行文件的符号表 _xxx, 如 _call:
(gdb) file user/_call

在这里插入图片描述
3. 之后便可以对对应的 C 文件 call.c 打断点调试:
[MIT 6.S081] Lab 0: 实验配置, 调试及测试_第7张图片

相关指令

常用

  • b : 添加断点
  • c: 继续运行, 遇到断点会中断
  • s: 执行下一行代码,进入函数
  • n: 执行下一行代码, 不进入函数
  • finish: 直接运行完当前函数并返回
  • si: 执行下一条指令, 包括跳转指令
  • ni: 执行下一条指令(跳转指令则执行至返回)
  • d/delete: 删除所有断点
  • i args: 查看当前函数的入参
  • i locals: 查看局部变量
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第8张图片
  • watch : 设置监视变量, 当该变量发生变化时会提示

栈帧相关

  • i frame: 查看当前栈帧信息
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第9张图片
  • bt/backtrace: 查看完整栈帧
    在这里插入图片描述
  • frame -> i frame: 查看具体栈帧, nobt 显示的左侧的序号.
    在这里插入图片描述
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第10张图片

tui 界面相关

  • tui enable: 启动 tui 界面, 默认显示源码
    [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第11张图片
    • layout split: 可以同时查看源码和汇编代码
      [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第12张图片
    • layout asm: 查看汇编代码
    • layout reg: 查看寄存器信息
    • layout src: 查看源码信息
    • focus 在多窗口时, 聚焦到某一窗口, 如 focus src.
    • apropos tui: 显示和 tui 相关的指令
      [MIT 6.S081] Lab 0: 实验配置, 调试及测试_第13张图片

实验结果测试

在实验项目目录执行 make grade 命令后即可对整个实验进行结果测试
[MIT 6.S081] Lab 0: 实验配置, 调试及测试_第14张图片
make 之后会生成一个 grade-lab- 的测试文件, 利用该文件可以进行实验的单个测试.
[MIT 6.S081] Lab 0: 实验配置, 调试及测试_第15张图片

你可能感兴趣的:(MIT,6.S081,Labs,risc-v,c语言)