个人站点
个人独立博客站点: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
不主动加载内核文件,影响符号解析。
参考