前言
uCore和rCore的调试工作通常使用gdb进行调试,但是通常情况下使用gdb调试对于不同源文件之间的切换以及各个函数的搜索等个人感觉不太友好,而在vscode中可以解决这些痛点,但是根据uCore官方给出的Makefile文件中仅仅提供了在终端中使用gdb进行调试的方式,使用命令make debug
,结合vscode对源文件阅读搜索等方面的友好以及gdb的调试功能实现可视化快捷调试
vscode中结合gdb实现uCore可视化debug
主要设计到两方面的修改
vscode gdb启动项配置文件
{
"version": "0.2.0",
"configurations": [
{
"type": "cppdbg",
"request": "launch",
"name": "Attach to gdbserver",
//内核文件
"program": "${workspaceFolder}/build/kernel",
"miDebuggerServerAddress": "localhost:1234",
//指定远程调试端口,qemu启动后通过在1234端口监听等待debugger连接
"miDebuggerPath": "/usr/bin/riscv64-unknown-elf-gdb",//gdb路径
"cwd": "${workspaceRoot}",
//vscode的环境变量和workspaceFolder的功能一样,但是在vscode的后续版本中推荐使用 workspaceRoot
}
]
}
Makefile
新增命令make gdbsever
将QEMU启动,然后F5开启调试
gdb结合dashboard
感觉这种方式比单纯的gdb加tui的方式要舒服一点,甚至可能比vscode加gdb更方便舒服点,可以同时显示汇编码和源码,甚至在查看内存中的内容和寄存器方面更有优势,但是对于环境有一定的要求
安装调试工具链https://github.com/sifive/freedom-tools,修改Makefile文件使用
*-gdb-py
代替原来的*gdb
-
安装
gdb-dashboard
,及其用法https://github.com/cyrus-and/gdb-dashboard正常显示应该如下图所示,但是可能我的环境有问题,连续遇到了3个问题最后 一个是未知错误
First blood
make debug
启动后提示/usr/local/riscv64/python/lib/python3.7/lib-dynload/math.cpython-37m-x86_64-linux-gnu.so: undefined symbol: PyFloat_Type
动态链接库有问题,重新下载python3.7.0进行源码编译生成新的动态链接文件
wget https://mirrors.huaweicloud.com/python/3.7.0/Python-3.7.0.tgz tar xzvf Python-3.7.0.tgz cd Python-3.7.0/ ./configure --enable-shared make cp math.cpython-37m-x86_64-linux-gnu.so /usr/local/riscv64/python/lib/python3.7/lib-dynload/
Double kill
make debug
ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
没有动态链接文件,发现缺少环境变量和和文件,刚刚重新编译的3.7.0中是有这个文件的
export LD_LIBRARY_PATH="/usr/local/riscv64/python/lib:/usr/local/riscv64/python/lib:$LD_LIBRARY_PATH" #写入.bashrc中或者仅在中端中执行作为临时环境变量 cp libpython3.7m.so.1.0 /usr/local/riscv64/python/lib
Extermation
make debug
make: *** [Makefile:117: debug] Segmentation fault (core dumped),启动之后闪退
Suspend to solve this problem
gdb调试其他C程序
vscode中结合gdb实现rCore可视化debug
方案1第零章:实验环境配置 - Open-Source-OS-Training-Camp-2022 文档
修改Makefile文件
打开对应实验目录下的 Makefile
文件,例如在开发os8,那么就是 os8/Makefile
文件,在其结尾添加如下几行:
dbg: build
qemu-system-riscv64 -machine virt -nographic -bios $(BOOTLOADER) -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) -drive file=$(FS_IMG),if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0 -s -S
make dbg
之后,是照常的编译流程,编译完成后,Terminal会卡在启动qemu后的状态,此时,在VSCode中按下F5键开启调试
在新版本的rCore给出的Makefile文件中debug有make gdbserver和make gdbclient和上述原理类似
方案2支持Rust语言的源代码级内核调试工具
参考资料
os-lectures2023: OS Lectures 2022 Spring
rust-based-os-comp2023: 2023开源操作系统训练营
lab-uCore-Tutorial-Guide-2023S 文档 (learningos.github.io)
lab-rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档 (rcore-os.cn)
Introduction · GitBook (learningos.github.io)2020
Operating Systems: Three Easy Pieces (wisc.edu)
Index of /~remzi/OSTEP/Chinese (wisc.edu)
Introduction uCore Lab Documents (gitbooks.io)2015
操作系统-rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档 (rcore-os.cn)
文档信息
- 本文作者:wendaocsmaster
- 本文链接:https://wendaocsmaster.github.io/2023/04/01/Operating-system-rcore-and-ucore-debug/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)