使用vscode+qemu在线调试内核
前面的文章介绍了如何使用QEMU仿真ARM,QEMU自带GDB Server可以很方便的调试内核,非常有利于学习。
GDB调试
ubuntu上安装gdb
sudo apt-get install gdb-multiarch
gdb-multiarch是多架构版本,可以通过set architecture aarch64
指定架构
QEMU参数修改添加-s -S
#!/bin/bash
source/qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
-nographic \
-M virt \
-cpu cortex-a57 \
-smp 2 \
-m 1G \
-kernel source/linux-6.0.9/build/arch/arm64/boot/Image \
-append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
-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 模式,它会在 GDB 命令行界面中显示一个类似于文本图形界面的交互界面,方便用户进行调试操作。vmlinux 是 Linux 内核的符号表文件,包含了内核函数、变量等符号信息。几个内核产物可以参考文章 关于内核镜像文件的不同。
cd linux-6.0.9/build
gdb-multiarch --tui vmlinux
(gdb) set architecture aarch64
The target architecture is set to "aarch64"
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
(gdb) b start_kernel
Breakpoint 1 at 0xffff000011bf0470 (2 locations)
(gdb) c
即可在内核入口函数打断点。
VSCode调试
虽然已经有初步的GUI,但是看代码跳转等还是不够方便,我们使用vscode进行加强。使用vscode ssh内虚拟机,打开工程,详细使用教程参看 vscode离线安装与使用技巧 - 小满的博客 - 博客园 (cnblogs.com)
一定要先安装C/C++插件
将我已经写好的配置粘贴进去
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Linux-6.0.9",
"type": "cppdbg",
"request": "launch",
"program": "/home/lichong/Study/qemu/source/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
,现在就可以运行了
现在就可以愉快的调试了
关于VSCode GDB的操作不再赘述,可以参考VSCode C/C++(gdb)调试指南_vscode gdb调试-CSDN博客
总结
内核因为太过底层,在实体板子上在线调试也存在困难,通过借助QEMU可以非常方便的在线调试,对于学习内核学习代码是很好的主力