1. 如何调试我们的内核
1. GDB调试
- 安装gdb
sudo apt-get install gdb-multiarch
gdb-multiarch是多架构版本,可以通过set architecture aarch64
指定架构
- QEMU参数修改添加
-s -S
#!/usr/bin/sh
qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
-nographic \
-M virt \
-cpu cortex-a57 \
-smp 2 \
-m 1G \
-kernel linux-6.0.9/build/arch/arm64/boot/Image \
-append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
-initrd initrd.ext4 \
-s -S
-s
表示启用 GDB 服务,-S 表示启动时停止 CPU,等待 GDB 连接。
-s
可以指定调试端口,如 -s tcp::8888
。没有指定的默认情况下,端口号是 1234
执行上述脚本
进入内核目录linux-6.0.9/build
执行
gdb-multiarch --tui vmlinux
其中,–tui(Text User Interface) 用于启用 TUI 模式
cd linux-6.0.9/build
gdb-multiarch --tui vmlinux
(gdb) set architecture aarch64
The target architecture is set to "aarch64"
# 连接gdbserver
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
# 设置断点
(gdb) b start_kernel
Breakpoint 1 at 0xffff000011bf0470 (2 locations)
# 运行
(gdb) c
2. VSCode调试
我们虽然可以使用 gdb的方式来调,但是 还是不太方便。这里我们继续使用 vscode 来搭建调试环境。
确保写安装C/C++插件
- 在 launch.json 中添加如下内容
{
"version": "0.2.0",
"configurations": [
{
"name": "Linux-6.0.9",
"type": "cppdbg",
"request": "launch",
"program": "/home/leo/data_4t/cbx/qemu_linux_6.0.9_arm64/linux-6.0.9/build/vmlinux",//vmlinux路径
"args": [],//启动参数,如果需要记录日志可以自己增加参数。因为gdbsever已经有了参数,这里可以不用设置
"stopAtEntry": true,//会自动停在main,不需要则设置为false
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb", //运行模式
"logging": {
"moduleLoad": false,
"engineLogging": false,
"trace": false
},
"setupCommands": [ //命令
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "set architecture aarch64",
"text": "set architecture aarch64",
"ignoreFailures": true
}
],
"miDebuggerPath":"gdb-multiarch",//工具链gdb
"miDebuggerServerAddress":"localhost:1234"//远程端口
}
]
}
vmlinux路径按照实际情况修改保存。
先在终端执行qemu,再vscode内打开代码打断点init/main.c:934
,现在就可以运行了
2. 调试注意点
需要注意的是:内核只能用O2编译,很多变量都被优化了,不很方便。
可用下面方法来局部O0编译:
// 写在文件开头,O0编译本文件
#pragma GCC optimize ("O0")
// 写在函数开头,O0编译本函数
__attribute__((optimize("O0")))
这样如果遇到需要单步执行,或者看一些变量信息,会更加的方便。
- https://www.cnblogs.com/qmjc/p/14698328.html
- https://developer.aliyun.com/article/215591
3. 总结
- 通过 qemu 结合 vscode调试, 就可以顺利开始我们的 linux 内存管理 的学习了。