调试xv6

个人站点

个人独立博客站点:https://wzzzx.github.io/
后续考虑以维护独立博客为主。

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

调试工具

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

riscv64-unknown-elf-gdb

在{% post_link 6s081/运行xv6系统 “启动” %} 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。所以没办法使用这个工具进行调试了。

不知道课程官方为什么推荐这个作为调试工具,可能我哪些地方没有弄对吧

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调试不完全指北

上一篇:gdb


下一篇:面试官都叫好的Synchronized底层实现,这工资开多少一个月?