调试xv6
原文可在調試Xv6查看到,后續的更新將會更新到個人博客
調試是一個比較麻煩的事情,需要倒騰的東西有點多,而且有些問題我現在也沒搞清楚
調試工具
現在已知的調試工具有三種,暫時也還沒搞清楚它們之間具體有什么區別。
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調試不完全指北
總結
- 上一篇: token要加编码decode吗_彻底弄
- 下一篇: 树莓派安装OpenCV2教程 (详细教程