0%

FreeBSD源码笔记06-内核调试指南

本文结合上文交叉编译内核后,记录内核调试方法的整个过程,分三步,编译可调试内核,部署调试符号,使用vscode调试.只有通过修改源码,才能真正理解代码,真正理解代码背后的设计思想,所以要多动手尝试,慢则是快.

1. 内核编译选项

在你还没有打算定制内核以前,可以在内核文件中增加以下选项来增加内核调试功能

1
2
3
4
# freebsd_src/src/sys/amd64/conf/GENERIC
options DDB
options GDB
options KDB

2. 内核的调试符号

在调试内核以前可以想一个问题,一个系统还没有完全加载完全,可以也就不存在系统调用准备好这么一说,那么ptrace功能就不可能使用,所以只能开启qemu内置的GDB功能。

1
2
3
4
# -S  freeze CPU at startup (use 'c' to start execution)
# -s shorthand for -gdb tcp::1234
qemu-system-x86_64 -smp 2 -hda freebsd.qcow2 -m 2048M -boot cd \
-net user,hostfwd=tcp::2222-:22 -net nic -S -s

这里qemu开启gdbserver端口监听在1234端口.如果出现以下画面,请不要慌,这个是-S选项,开启虚拟机后cpu停顿的缘故.

3. VScode的调试

vscode打开文件夹src,编译内核的时候也是相对src目录的,参考FreeBSD源码笔记-内核交叉编译,另外打包的kernel目录里生成两个kernel文件夹:

  • kernel/boot/kernel/kernel文件是部署在qemu虚拟机上的.
  • kernel/usr/lib/debug/boot/kernel/kernel.debug是vscode要用到的文件

vscode的调试配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"version": "0.2.0",
"configurations": [
{
"name": "kernel debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/../kernel/usr/lib/debug/boot/kernel/kernel.debug",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath":"/usr/local/bin/gdb",
"miDebuggerServerAddress": "127.0.0.1:1234"
}
]
}

开启调试后界面如下:

其他:

如果使用命令行调试,进入gdb界面后,使用target remote 127.0.0.1:1234连接上去.

1
2
3
4
5
gdb kernel.debug
# disas/m btext
# 找到btext符号的地址
# break *0x*0xffffffff80388000
# 将断点设置在boot2的最后阶段,进入内核的开始位置btext符号处.