Skip to content

005-08: VSCode 调试配置

概述

Cinux 项目配置了完整的 VSCode 调试环境,支持通过 GDB 远程调试 QEMU 中运行的内核。配置文件位于 .vscode/ 目录。

配置文件结构

.vscode/
├── launch.json      # 调试配置(F5 启动)
├── tasks.json       # 构建任务(Ctrl+Shift+B)
└── gdbinit          # GDB 初始化脚本

1. launch.json - 调试配置

文件:.vscode/launch.json

完整配置

展开代码 (共 43 行)收起代码
json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "QEMU 调试 (mini kernel)",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/kernel/mini/mini_kernel",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath": "gdb",
            "miDebuggerServerAddress": "localhost:1234",
            "setupCommands": [
                {
                    "text": "-gdb-set architecture i386:x86-64"
                },
                {
                    "text": "-gdb-set disassembly-flavor intel"
                },
                {
                    "text": "-gdb-set pagination off"
                }
            ]
        },
        {
            "name": "QEMU 调试 (stage2 bootloader)",
            "type": "cppdbg",
            "request": "launch",
            "program": "/usr/bin/true",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerServerAddress": "localhost:1234",
            "miDebuggerPath": "gdb",
            "setupCommands": [
                {
                    "description": "加载 stage2 符号",
                    "text": "-file-exec-and-symbols ${workspaceFolder}/build/boot/stage2",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

配置项说明

配置项说明
typecppdbgC++ 调试类型
requestlaunch启动调试(非 attach)
MIModegdb使用 GDB 作为后端
miDebuggerPathgdbGDB 可执行文件路径
miDebuggerServerAddresslocalhost:1234QEMU GDB stub 监听地址
setupCommands-GDB 启动时执行的命令

setupCommands 详解

命令说明
-gdb-set architecture i386:x86-64设置目标架构为 x86-64
-gdb-set disassembly-flavor intel使用 Intel 语法的反汇编(而非 AT&T)
-gdb-set pagination off禁用分页,避免输出暂停

2. tasks.json - 构建与运行任务

文件:.vscode/tasks.json

关键任务

任务名称命令说明
CMake: Configurecmake -B build配置 CMake 项目
CMake: Build allcmake --build build构建整个项目(默认)
QEMU: Run debug modemake -C build run-debug启动 QEMU 调试模式(后台)
CMake: Build & Run QEMU debug顺序执行上述两个先构建再启动 QEMU
QEMU: Run normalmake -C build run正常启动 QEMU(非调试)

QEMU 调试模式任务

json
{
    "label": "QEMU: Run debug mode",
    "type": "shell",
    "command": "make",
    "args": ["-C", "build", "run-debug"],
    "isBackground": true,
    "group": "build",
    "problemMatcher": [],
    "detail": "启动 QEMU 调试模式(监听 :1234)"
}

Make 目标定义

来源:cmake/qemu.cmake

makefile
add_custom_target(run-debug
    COMMAND ${QEMU_EXECUTABLE} ${QEMU_COMMON_FLAGS} ${QEMU_DEVELOP_FLAG} ${QEMU_DEBUG_FLAGS}
        -drive file=${CINUX_IMAGE_PATH},format=raw,index=0,media=disk
    DEPENDS image
    COMMENT "Starting QEMU in debug mode (GDB on :1234)"
    VERBATIM
)

其中 QEMU_DEBUG_FLAGS 定义为:

makefile
set(QEMU_DEBUG_FLAGS
    -s      # GDB stub 监听 TCP 端口 1234
    -S      # 启动时暂停 CPU,等待 GDB 连接
)

3. gdbinit - GDB 初始化脚本

文件:.vscode/gdbinit

plaintext
# 修复 GDB 17.x 与 QEMU 的兼容性问题
add-symbol-file build/boot/stage2

使用方式

VSCode 的 launch.json 会自动加载此文件(通过 GDB 的 -x 参数或 .gdbinit 默认加载)。


4. 完整调试流程

方法一:VSCode 图形界面调试

1. 打开 VSCode,进入项目目录
2. 按 F5 或选择 "Run and Debug"
3. 选择 "QEMU 调试 (mini kernel)"
4. VSCode 会:
   - 自动构建项目
   - 启动 QEMU(后台运行)
   - 连接 GDB 到 localhost:1234
   - 在入口点暂停

方法二:手动分步调试

bash
# Terminal 1: 启动 QEMU 调试模式
cd build && make run-debug
# QEMU 会暂停,等待 GDB 连接

# Terminal 2: 启动 GDB
gdb build/kernel/mini/mini_kernel
(gdb) target remote :1234
(gdb) break _start
(gdb) continue

方法三:VSCode + 手动 QEMU

bash
# Terminal: 先启动 QEMU
cd build && make run-debug

# VSCode: 按 F5 启动调试
# 会自动连接到已运行的 QEMU

5. 常用调试操作

VSCode 操作GDB 命令说明
F5continue继续执行
F10next / nexti单步跳过
F11step / stepi单步进入
Shift+F11finish跳出函数
Shift+F5-exec quit停止调试

断点操作

操作说明
点击行号左侧设置/取消断点
Ctrl+Shift+F5重启调试
条件断点右键断点 → "Edit Breakpoint" → "Add Condition"

6. 调试示例

在 mini_kernel_main 处设置断点

cpp
// kernel/mini/test/main_test.cpp
extern "C" [[noreturn]] void mini_kernel_main(uint64_t boot_info_addr) {
    // 在这里设置断点
    BootInfo* boot_info = (BootInfo*)__boot_info_ptr;
    ...
}

VSCode 操作:

  1. 打开 main_test.cpp
  2. 在第 22 行点击左侧,设置断点
  3. 按 F5 启动调试
  4. 程序会在断点处暂停

查看汇编代码

  1. 在 "DEBUG CONSOLE" 中输入:
-exec x/10i $pc
  1. 或右键代码编辑器 → "Open Disassembly View"

7. 故障排查

问题:连接失败 "Connection refused"

原因:QEMU 未启动或未使用 -s 参数

解决

bash
# 确保 QEMU 正在运行并监听 1234 端口
netstat -tuln | grep 1234
# 或
lsof -i :1234

问题:符号未加载

原因:GDB 找不到符号文件

解决

plaintext
# 手动加载符号
(gdb) file build/kernel/mini/mini_kernel
# 或
(gdb) symbol-file build/kernel/mini/mini_kernel

问题:断点不生效

原因:代码被优化掉或地址不匹配

解决

bash
# 确保 Debug 构建
cmake -DCMAKE_BUILD_TYPE=Debug -B build

8. 相关链接

035_multi_terminal-40-g5d72b8b · 5d72b8b · 2026-06-26