vscode + qemu + gdb 搭建内核开发环境
https://zhuanlan.zhihu.com/p/105069730
在能够使用 qemu + gdb 调试内核之后,怎么连上 vscode 呢?
看看参考的知乎文章,再看看这个视频: https://www.bilibili.com/video/BV19Y41157bK/?spm_id_from=333.788&vd_source=7a1a0bc74158c6993c7355c5490fc600
先安装这个插件
然后创建 .vscode/launch.json 文件,点击 add configuration,创建template
这是我的launch.json配置:
{
"name": "kernel-debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/kernel.bin",
"stopAtEntry": false,
"args": [],
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "127.0.0.1:1234",
"logging": {
"engineLogging": false
},
}
如果要调试 nasm 程序的话:
launch.json
{
"name": "nasm",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "nasm",
"miDebuggerPath": "/usr/bin/gdb"
}
总的来说, launch.json 是
{
"configurations": [
{
"name": "kernel-debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/kernel.bin",
"stopAtEntry": false,
"args": [],
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "127.0.0.1:1234",
"logging": {
"engineLogging": false
},
},
{
"name": "nasm",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "nasm",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json长得不太一样
tasks.json:
{
"type": "shell",
"label": "nasm",
"command": "",
"args": [
"/usr/bin/nasm",
"-f",
"elf32",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.o",
";",
"/usr/bin/gcc",
"-fdiagnostics-color=always",
"-m32",
"-g",
"-static",
"${fileDirname}/${fileBasenameNoExtension}.o",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.out"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
注意,nasm 的 -gdwarf 选项是使用 gdb 调试 nasm 程序所必须的,且这个选项不能与 -f bin 混合使用 (也正是这个原因,boot.asm 无法用 gcc 调试,但是这种小规模的代码,有 qemu+gdb 在汇编进行调试就够了)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?