调试xv6
Jacksing

调试是一个比较麻烦的事情,需要倒腾的东西有点多,而且有些问题我现在也没搞清楚

调试工具

现在已知的调试工具有三种,暂时也还没搞清楚它们之间具体有什么区别。

riscv64-unknown-elf-gdb

启动 xv6 的一文介绍了 SiFive 有提供一套工具链用来启动系统,在这套工具链里可以找到 riscv64-unknown-elf-gdb 用于调试

gdb-multiarch

官方工具页所提供的工具是 gdb-multiarch。这个可以通过 apt-get 直接安装。此外,在工具页所提供的 GitHub 中可以发现,该仓库所提供的包也是 riscv64-unknown-elf-gdb

riscv64-linux-gnu-gdb

视频中可以看到,老师所使用的调试工具是 riscv64-linux-gnu-gdb,因为前面的工具已经解决了调试问题,所以没有去找这个包的安装方式

.gdbinit 文件

每次开启调试的时候,Makefile 会使用 .gdbinit.tmpl-riscv 生成.gdbinit 文件。从 Makefile 可以看到,会变的地方就是调试端口号。这个文件的用途是用于初始化调试环境,gdb 启动的时候会读取其中的命令并执行。具体可以见帮助文档

疑难杂症

Undefined item: "riscv:rv64"

使用 gdb-multiarch 时会在开头看到这个错误提示,此时通过命令 set architecture 查看当前所支持的所有系统架构,发现并没有 riscv64 的支持,怪不得会有这个错误提示。在 Stack Overflow 上找到的答案说需要将版本升级到 8.3 以上才可以。但是我的系统是 Ubuntu 18.04系统源所支持的最高版本就只有 8.1.1。所以没办法使用这个工具进行调试了。

不知道课程官方为什么推荐这个作为调试工具,可能我哪些地方没有弄对吧 Ubuntu 18 的源所带的版本太旧了,所以不支持 riscv 架构。需要把系统升级到 20 以上的版本才可以。

no symbol table is loaded. use the file command

出现这个问题是因为符号没有正确的加载,一开始有怀疑是编译的时候没有使用 -g 这个选项,导致没有把符合表打进去。但是查看 Makefile 后发现,其使用了 -ggdb 这个命令,一样能够将符号表打到可执行文件里。要解决这个问题也很简单,只需要在 gdb 的命令行里输入 file kernel/kernel 就可以把内核的符号加载进来

auto-loading has been declined by your `auto-load safe-path’ set to “$debugdir:$datadir/auto-load”

这个也很奇怪,每次启动的时候都会输出这个警告。后来才意识到,为了出现避免出现一些安全问题gdb 不会再主动的执行任何文件。所以需要在用户目录下声明,xv6 这个仓库的 .gdbinit 文件是安全的

通过 echo add-auto-load-safe-path {PATH}/.gdbinit > ~/.gdbinit 命令,其中 {PATH} 换成自己仓库路径即可

这个问题顺带影响了第二个问题。如果没有添加为可信任文件,会导致 gdb 不主动加载内核文件,影响符号解析。

参考

GDB 配置与 .gdbinit 的编写

Security restriction for auto-loading

GDB调试指南1

MIT 6.S081 xv6调试不完全指北

  • 本文标题:调试xv6
  • 本文作者:Jacksing
  • 创建时间:2022-01-22 21:22:08
  • 本文链接:https://wzzzx.github.io/6-S081/debug-xv6/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论