1. 调试配置选择

  • 调试 C 程序:选择 "Debug C Program"(调用 gcc 编译)。

  • 调试 C++ 程序:选择 "Debug C++ Program"(调用 g++ 编译)。


2. 调试步骤

  1. 打开代码文件:确保当前编辑器打开的是 .c 或 .cpp 文件。

  2. 设置断点:在代码行号左侧点击设置断点(红点)。

  3. 启动调试

    • 按 F5 或点击左侧调试图标 → 顶部下拉菜单选择调试配置(如 Debug C Program)→ 点击绿色箭头启动。

  4. 调试控制

    • 继续(continue, F5):运行到下一个断点。

    • 单步调试 / 逐语句(Step Into, F11):进入当前行的函数内部,一步一步执行函数内的代码。

    • 单步跳过/逐过程(step over,F10):执行当前行代码,但不进入函数内部,直接跳到下一行。当你不想进入某个函数的内部,只想看它的执行结果。例如,执行 fscanf(inputFile, "%d", &serve_time[i]); 时,按 F10 会直接读取数据,而不会进入 fscanf 的内部实现。

    • 单步跳出(Step Out, Shift+F11):从当前函数中跳出,返回到调用它的地方。当你进入了一个函数(比如 compare),但不想逐行执行完,想直接返回到调用它的地方(比如 qsort 内部)。

    • 查看变量:在调试侧边栏的 VARIABLES 区域查看当前变量值。

调试示例

假设你在调试这段代码:

qsort(serve_time, n, sizeof(int), compare);  // 假设在这里设置断点
for (int i = 0; i < n; i++) {
    fscanf(inputFile, "%d", &serve_time[i]);
}
操作示例
  1. 设置断点:在 qsort 行左侧点击,出现红点(断点)。

  2. 启动调试F5),程序会在 qsort 处暂停。

  3. 按 F11(Step Into):进入 qsort 内部(如果有调试信息)。

  4. 按 Shift+F11(Step Out):跳出 qsort,回到主函数。

  5. 按 F10(Step Over):执行 qsort,但不进入内部,直接跳到 for 循环。

  6. 按 F5(Continue):继续运行,直到程序结束或下一个断点。

总结

操作 快捷键(VS Code) 作用
继续 F5 运行到下一个断点或程序结束
单步调试(逐语句) F11 进入函数内部
逐过程 F10 执行当前行,不进入函数
单步跳出 Shift+F11 跳出当前函数

3. 关键验证点

检查编译是否成功
  • 调试前会自动执行 preLaunchTask(即 tasks.json 中的编译任务)。

  • 如果编译失败:

    • 检查终端输出错误(如语法错误)。

    • 确保 gcc/g++ 命令在终端可直接运行(验证环境变量配置)。

检查调试器路径
  • Windows:若使用 MinGW,需将 miDebuggerPath 改为绝对路径(如 "C:/TDM-GCC-64/bin/gdb.exe")。

  • Linux/macOS"gdb" 通常可用(确保已安装 gdb/lldb)。

检查输出文件路径
  • 你的配置将生成 .out 文件(如 main.c → main.out),需与 launch.json 的 program 字段一致。


4. 常见问题解决

调试时显示无法打开文件(例如无法打开inout.txt)
  • 在 VS Code 中调试时,默认的工作目录是项目根目录(D:\myvscode),程序默认会在当前工作目录(即 D:\myvscode)下查找 input.txt

  • 如果你不确定当前工作目录,可以在代码中打印当前路径:

    #include <direct.h>
    char cwd[1024];
    _getcwd(cwd, sizeof(cwd));
    printf("当前工作目录: %s\n", cwd);
  • 如果你希望程序在其他目录查找文件,可以修改代码中的文件路径,例如:

    FILE *inputFile = fopen("D:/myvscode/input.txt", "r");
    FILE *outputFile = fopen("D:/myvscode/output.txt", "w");
    
调试时提示“无法找到 .out 文件”
  • 原因:编译失败或路径错误。

  • 解决:

    1. 手动运行编译命令(如 gcc -g main.c -o main.out)确认是否成功。

    2. 检查 ${fileDirname}/${fileBasenameNoExtension}.out 路径是否正确。

断点未生效
  • 确保编译时包含 -g 参数(生成调试信息)。

  • 重新启动调试会话(有时需清理旧的可执行文件)。

Windows 下终端无输出
  • 将 externalConsole 改为 true(部分 Windows 环境需要外部终端显示输出)。

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug C Program",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,  // 改为 false 使用 VSCode 终端
            "MIMode": "gdb",
            "miDebuggerPath": "gdb",  // Windows 改为 "C:/TDM-GCC-64/bin/gdb.exe"
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "gcc build active file"  // 编译 C 文件
        },
        {
            "name": "Debug C++ Program",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "gdb",  // Windows 改为 "C:/TDM-GCC-64/bin/gdb.exe"
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++ build active file"  // 编译 C++ 文件
        }
    ]
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "gcc build active file",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out"
            ],
            "group": "build",
            "problemMatcher": [
                "$gcc"
            ],
            "detail": "编译当前 C 文件"
        },
        {
            "label": "g++ build active file",
            "type": "shell",
            "command": "g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out"
            ],
            "group": "build",
            "problemMatcher": [
                "$gcc"
            ],
            "detail": "编译当前 C++ 文件"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: gcc.exe 生成活动文件",
            "command": "C:\\TDM-GCC-64\\bin\\gcc.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ]
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐