在 BTD 的开发中经常会遇到 debug 的需求,BTD 提供了一个方便的调试流程,只需启动两个 shell 即可 开始调试
下面将演示一次具体的调试流程
- 启动两个 shell,在项目根目录下分别运行
make debug-server
和make debug
, 之后只需要在运行make debug
的 shell 中执行接下来的命令即可
# 从当前 pc 开始显示 11 条指令,11 条是不发生折叠的极限(也可能只是我这是这样)
(gdb) x/11i $pc
(gdb) b *0x80000000 # 在内核第一条指令处打个断点
(gdb) c # continue 执行到断点处
(gdb) si # si 单步执行 (step in,会嵌入函数具体流程中)
需要注意的是,在多核运行时,代码执行过程中会出现系统线程的切换,例如下面这样:
(gdb) c
Continuing.
[Switching to Thread 1.2]
这时候我们要看当前线程的状态,根据当前状态进行调试,该打断点的地方不要忘了打断点,不然会跑飞
像是这样,只能用 Ctrl + C 来掐死 (主要是我也没去找其他可能的方法 😛):
看到地址了吗,直接归零,而且这块地址是不可访问的,只能卡在这了,除非扬了当前的 shell 重来(大概
Thread 2 received signal SIGINT, Interrupt.
0x0000000000000000 in ?? ()
(gdb) x/11i $pc
=> 0x0: Cannot access memory at address 0x0
(gdb)