在学习嵌入式Linux系统时,需要对 Linux Kernel 进行调试。Linux(PC)下的gdb工具提供了类图形化的调试界面,但代码仅在有限的窗口上显示,且为单色显示,调试时不利于代码阅读。Visual Studio Code提供了良好的解决方案。
本文记录了基于VSCode+GDB+QEMU图形化调试Linux的过程,与读者分享。
VSCode基础环境:在Visual Studio Code中使用SSH建立远程Linux开发环境;
QEMU准备:QEMU编译安装及Linux系统仿真;
GDB安装(也可以使用交叉编译工具链自带的GDB工具):
sudo apt-get install -y gdb-multiarch # 支持多种硬件体系架构的GDB版本
Linux下的调试:
gdb-multiarch --tui vmlinux
汇编语言入口(stext
):
C语言入口(start_kernel
):
如上,虽然 Linux(PC)下能产生类图形化的调试界面,但代码显示和单步运行时存在诸多不完美的的地方。
主要配置 .vscode/launch.json
和 .vscode/tasks.json
。
.vscode/launch.json
:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "kernel-qemu-debug",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "127.0.0.1:1234",
"miDebuggerPath": "/usr/bin/gdb-multiarch",
"program": "${workspaceFolder}/vmlinux",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"logging": {
"engineLogging": false
},
"MIMode": "gdb"
}
]
}
在终端手动启动QEMU仿真的调试效果:
【注意】:需要先在断点处设置好断点,否则 F5 启动GDB调试后,程序会直接开始运行,无法跟踪Linux内核启动的过程。
接下来,尝试 F5
开启DBG调试时,自动运行QEMU仿真器。
在上文 .vscode/launch.json
的 configurations
中添加 "preLaunchTask": "qemu",
;
.vscode/tasks.json
:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "qemu",
"type": "shell",
"command": "qemu-system-arm -nographic -machine mcimx6ul-evk -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/imx6ull-14x14-evk.dtb -append \"console=ttymxc0,115200 root=/dev/mmcblk0 rootfstype=ext4 loglevel=8\" -drive file=~/rootfs.ext4,format=raw,id=sdcard -device sd-card,drive=sdcard -S -s",
"presentation": {
"echo": true,
"clear": true,
"group": "qemu"
},
"isBackground": true,
"problemMatcher": []
}
]
}
【待解决】
无法跟踪任务qemu,请确保已定义了问题匹配程序
,该问题猜测是problemMatcher
没有配置正确。^_^ 欢迎读者评论留言提供解决方法 ^_^
【临时解决方法】出问题时,勾选
记住我对此任务的选择
并点击仍要调试
。
接下来按 F10
或 F11
单步跟踪Linux系统的启动过程。
Visual Studio Code调试快捷键:
快捷键 | 说明 |
---|---|
F5 |
启动GDB调试,继续运行(continue) |
F10 |
单步跳过(next) |
F11 |
单步(step) |
Shift+F5 | 退出(quit) |
Shift+F11 | 单步跳出 |
Ctrl+Shift+F5 | 重启(重新启动GDB调试) |
Linux下GDB命令行调试程序时,可通过 help $command
查看帮助信息。常用的GDB调试命令如下:
命令 | 解释 | 简写 |
---|---|---|
break | 在指定位置设置断点 | b |
continue | 继续执行程序 | c |
help | GDB中的帮助命令 | h |
next | 执行一行源代码但不进入函数内部 | n |
quit | 退出GDB | q |
step | 执行一行源代码而且进入函数内部 | s |
backtrace | 堆栈回溯 | bt |
delete | 删除设置的断点 | d |
disassemble | 反汇编指定的内存部分 | 无 |
file | 装入想要调试的可执行文件 | 无 |
info break | 查看设置断点的信息 | i b |
list | 列出产生执行文件源代码的一部分 | l |
输出当前指定变量的值 | p | |
run | 执行当前被调试的程序 | r |
target | 连接到目标机器或进程 | 无 |
watch | 监视一个变量的值,一旦值有变化,程序停住 | wa |