本文结合上文交叉编译内核后,记录内核调试方法的整个过程,分三步,编译可调试内核,部署调试符号,使用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
5gdb kernel.debug
disas/m btext
找到btext符号的地址
break *0x*0xffffffff80388000
将断点设置在boot2的最后阶段,进入内核的开始位置btext符号处.