Table of Contents

GDB调试

  1. C也适用
  2. 在gdb调试的时候,stdout的内容也是可以看到的
  3. 运行到某个断点的时候,断点的一行应该还没有被执行

命令

  1. g++ -g(编译的时候使用-g参数,可以在目标文件中添加调试信息,用于调试)
  2. gdb a.out(gdb的参数是二进制文件)
  3. b <function_name> 打断点
  4. r 开始运行(gdb是一个交互环境)
  5. n 步进
  6. p <variable_name> 显示变量的值
  7. q 退出

VS Code

目前这种方法应该只适用于单文件调试

环境:MacOS G++/GDB(实际上M芯片的Mac上不方便使用gdb,下面我们使用lldb代替,lldb可以兼容g++的调试信息)
VS Code最好提前装好C++的环境包(ms-vscode.cpptools) & damiankoper.gdb-debug(插件,不一定需要)

首先需要是在打开一个文件夹的状态下,需要调试的文件是当前激活的标签,进入左边栏的调试界面

可以自己创建launch.json,配置调试方式
自己手动配置可以参考这里:https://www.youtube.com/watch?v=G9gnSGKYIg4

自己配置好的文件内容如下,使用自己配置的方式比较好:(这两个文件没有的话,自己手动创建一下)

# .vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o", "${fileDirname}/${fileBasenameNoExtension}",
                "--std=c++17",
                "-DZH_DEBUG"
            ],
            "problemMatcher": ["$gcc"]
        }
    ]
}
# .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) Zhonghui",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            // "args": ["<", "${fileDirname}/in.txt"],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "build"
        }
    ]
}

也可以点击[Show all automatic debug configurations],然后选择自动的配置文件(见图)
这种方式有概率出错(Configuration 'C/C++: g++ build and debug active file' is missing in 'launch.json'.),重启一下VS Code就可以了,有点迷(所以不推荐使用这种方式)


然后打好断点就可以开始调试了(要注意,开启调试的时候,需要调试的文件需要是正在激活的标签页)

中途会有权限访问请求,同意即可

如何输入?方案1

// freopen("in.txt","r",stdin); // 好复古的写法
 
// 在task.json里面指定了,编译的时候定义了一个宏(ZH_DEBUG)
#ifdef ZH_DEBUG
    freopen("in.txt", "r", stdin);
#endif

如何输入?方案2
调试的时候需要手动输入的话还需要手动配置(应该是弹出专门的输入窗口,或者配置“<”,“in.txt”这样的程序参数,不能通过配置参数实现重定向)

输出则可以在调试窗口直接看到