环境准备
-
操作系统:本人采用的操作系统版本为
Ubuntu 20.04.2 LTS
# 进入wsl系统 $ wslfetch
-
实验代码
xv6-labs-2020
-
gdb调试工具
gbd-multiarch
, 该工具可通过命令sudo agt-get install gdb-multiarch
下载。$ sudo agt-get install gdb-multiarch $ gdb-multiarch --version GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2 Copyright (C) 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
启动调试
-
首先进入文件夹
xv6-labs-2020
,启动xv6系统。$ cd xv6-labs-2020 $ make CPUS=1 qemu-gdb
-
其次,启动gdb调试工具。
$ cd xv6-labs-2020 $ gdb-multiarch 显示如下:
按照提示,在
/home/xxx/.gdbinit
文件中添加如下内容:add-auto-load-safe-path /home/xxx/project/mit6s081/xv6-labs-2020/.gdbinit
再次执行
gdb-muliarch
,显示如下即可:
调试步骤
-
调试内核:gdb-multiarch的窗口输入如下命令:
(gdb) b _entry # 在entry处加上断点 (gdb) info address _entry # 查看entry的地址 0x80000000 (gdb) b main # 在kernel的main函数上加断点 (gdb) b userinit # 在userinit函数上加断点 (gdb) c # 让系统跑起来,此时可以开始调试了 (gdb) layout split # 将gdb的窗口划分为多个,方便查看代码和指令
-
调试工具类可执行文件:在gdb中输入如下命令
(gdb) file user/_usertests # 还可以类似于user/_xargs等 (gdb) b main (gdb) c # 此时,待内核代码启动完成之后,输入usertests命令,便可以在调试窗口进行调试。
gdb layout
gdb的layout命令可以在调试时查看源码,寄存器,以及汇编代码。常用的指令如下:
指令 | 用途 |
---|---|
layout src | 显示源代码窗口 |
layout asm | 显示汇编窗口 |
layout regs | 显示寄存器窗口 |
layout split | 显示源代码窗口和寄存器窗口 |
layout next | 显示下一个layout |
layout pre | 显示前一个layout |
Ctrl + L | 刷新当前窗口 |
Ctrl + x,再按1 | 单窗口模式,显示一个窗口 |
Ctrl + x,再按2 | 双窗口模式,显示两个窗口 |
Ctrl + x,再按a | 回到执行layout之前的普通窗口 |
GDB调试常用命令
where
: 查看栈帧finish
: 停止当前函数,返回至上一个函数x/i 0x80001f2e
,查看地址中的指令和指令所在的函数名print $ra
, 打印ra寄存器的内容
参考链接
https://zhuanlan.zhihu.com/p/466424852