vscode C/C++ CMake 调试

devtools/2025/2/13 21:54:02/
  • C/C++插件:
    • .vscode
      • c_cpp_properties.json
      • launch.json
      • settings.json
      • tasks.json
  • CMake插件
    • CMakeLists.txt
# CMakeLists.txt

vscode_15">一、CMakeLists.txt 如何支持vscode在线调试?

  • CMake支持调试; C/C++插件也支持调试;二者有区别;
  • C/C++的launch.json task.json只能小规模的;大规模的依赖,还是需要CMake
    • 那么CMake之后的工程,如何在线debug呢?
  1. CMakeLists.txt中添加:
set(CMAKE_BUILD_TYPE Debug)  # 确保是 Debug 模式
set(CMAKE_CXX_FLAGS_DEBUG "-g")  # 添加调试符号
  1. C/C++插件 debug修改:

  2. 修改 .vscode/tasks.json 支持 -g 要修改 .vscode/tasks.json 以支持 debug,需要确保以下几点:

  3. 生成可调试的可执行文件(已包含 -g,符合要求)。

  4. 正确配置 launch.json 以启动调试


修改 tasks.json

当前 tasks.json 已经包含 -g 选项,这是用于调试的信息,因此你只需要确保它编译 .cpp 文件并生成可执行文件。
如果你希望 支持多文件编译,可以改为:

{"tasks": [{"type": "cppbuild","label": "C/C++: g++ 编译(调试)","command": "/bin/g++","args": ["-fdiagnostics-color=always","-g","${workspaceFolder}/*.cpp",   // 编译所有 CPP 文件"-o","${workspaceFolder}/app"       // 生成 "app" 可执行文件],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "用于调试的编译任务"}],"version": "2.0.0"
}

添加 launch.json(启动 GDB 进行调试)

你还需要在 .vscode/launch.json 添加 GDB 调试支持:

{"version": "0.2.0","configurations": [{"name": "GDB 调试","type": "cppdbg","request": "launch","program": "${workspaceFolder}/app","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "启用 Pretty Printing","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "C/C++: g++ 编译(调试)","miDebuggerPath": "/usr/bin/gdb"}]
}

使用方法

  1. 编译代码

    • 在 VSCode 任务栏运行 “C/C++: g++ 编译(调试)” 任务
    • 生成 app 可执行文件
  2. 启动调试

    • 打开 Run(运行) -> Start Debugging(开始调试)
    • 选择 “GDB 调试”,会自动调用 GDB 调试 app

额外优化

如果你的程序有多线程或使用 OpenCV,可以添加:

"launch.json":
{"environment": [{ "name": "LD_LIBRARY_PATH", "value": "/usr/local/lib" }]
}

这样可以避免 OpenCV 等动态库找不到。


总结

tasks.json 确保编译支持 -g,并指定 单文件/多文件编译
launch.json 确保 GDB 运行 app,并支持 Pretty Printing
✅ 运行 Ctrl+Shift+B 编译,然后 F5 调试 🚀

报错:“/usr/bin/gdb” --interpreter=mi --tty=${DbgTerm} 0<“/tmp/Microsoft-MIEngine-In-x3btbmiu.21b” 1>“/tmp/Microsoft-MIEngine-Out-ix3okr2v.yh4”

这个错误通常出现在 VSCode 使用 gdb 进行调试时,可能的原因如下:

可能原因及解决方案

1. VSCode 配置错误

检查 .vscode/launch.json 是否正确,尤其是 miDebuggerPathMIMode

"miDebuggerPath": "/usr/bin/gdb",
"MIMode": "gdb"

确保 miDebuggerPath 指向 正确的 GDB 路径。如果 gdb 安装在其他目录,可以使用:

which gdb

然后在 launch.json 中修改 miDebuggerPath


2. GDB 没有安装

尝试在终端运行:

gdb --version

如果 gdb 没有安装,可以通过以下命令安装:

sudo apt update && sudo apt install gdb  # Ubuntu/Debian
sudo yum install gdb  # CentOS
sudo pacman -S gdb  # Arch Linux
brew install gdb  # macOS(Homebrew)

3. 终端权限问题

VSCode 调试器可能无法正确访问 GDB 终端,尝试:

sudo chmod +x /usr/bin/gdb

或者以 管理员权限 运行 VSCode:

sudo code .

4. 关闭 GDB 的 tty 相关设置

可以尝试在 launch.json 中添加:

"setupCommands": [{"text": "set new-console off","description": "禁用 GDB 新终端","ignoreFailures": true}
]

5. 直接在终端运行 GDB

如果 VSCode 仍然报错,尝试手动运行:

gdb build/app

看看是否能正常启动调试,如果手动运行没有问题,则 VSCode 配置可能有问题。


6. 可能的 VSCode 插件 Bug

如果 之前调试是正常的,但突然无法使用,可能是 VSCode 更新导致插件问题:

  • 试试 回退到旧版本的 VSCode,或者
  • 重装 C/C++ 插件
    1. 删除 VSCode C++ 插件
    2. 重启 VSCode
    3. 重新安装 C/C++ 扩展(ms-vscode.cpptools)
    4. 尝试重新调试

7. 重新生成 CMake 构建目录

如果调试文件损坏,尝试:

rm -rf build
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build

然后重新尝试 F5 调试。


总结

检查 launch.jsonmiDebuggerPath 是否正确
确认 gdb 是否已安装,并可以手动运行
尝试 set new-console off 关闭 tty 相关设置
可能是 VSCode 插件 Bug,尝试重装 C/C++ 插件
重新生成 CMake 构建目录

试试这些方法,看能否解决你的问题!🚀


http://www.ppmy.cn/devtools/158597.html

相关文章

唯一值校验的实现思路(续)

本文接着上一篇文章《唯一值校验的实现思路》&#xff0c;在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增&#xff0c;如果是传入true&#xff1b;反之传入false* return void* date…

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

QT修仙笔记 事件大圆满 闹钟大成

学习笔记 牛客刷题 闹钟 时钟显示 通过 QTimer 每秒更新一次 QLCDNumber 显示的当前时间&#xff0c;格式为 hh:mm:ss&#xff0c;实现实时时钟显示。 闹钟设置 使用 QDateTimeEdit 让用户设置闹钟时间&#xff0c;可通过日历选择日期&#xff0c;设置范围为当前时间到未来 …

React函数组件和类组件

在 React 中,函数组件是使用 JavaScript 函数定义的组件。函数组件是最基本和最常见的 React 组件类型,通常用于渲染 UI 和处理简单的逻辑。 与类组件相比,函数组件更简洁、易于理解,且性能更高,因为它没有类组件中的生命周期方法和实例化的开销。 1. 函数组件的基本结构…

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样&#xff1f; 这里描述自己在使用AI进行数据分析&#xff08;数据清洗&#xff09;过程中的几个小故事&#xff1a; 1. 变量名的翻译 有一个项目是某医生自己收集的数据&#xff0c;变量名使用的是中文&#xff0c;分…

浏览器自动化与AI Agent结合项目browser-use初探

browser-use介绍 browser-use是将您的 AI 代理连接到浏览器的最简单方式。它通过提供一个强大且简单的接口来实现 AI 代理访问网站的自动化。 GitHub地址&#xff1a;https://github.com/browser-use/browser-use。目前已经获得了27.3k颗stars&#xff0c;2.7kforks&#xff…

尝试分析一下go语言和php语言对建立mysql链接有什么不同

在Go语言和PHP中建立MySQL连接的主要差异体现在连接管理、生命周期、并发处理等方面。以下是详细分析&#xff1a; 1. 连接管理方式 Go语言&#xff1a; 使用连接池&#xff08;通过database/sql包管理&#xff09;&#xff0c;默认情况下自动维护连接池。 通过sql.Open()初始…

深度剖析观察者模式:从理论到实战的Java实现

在软件设计中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09; 是一种高频使用的行为型设计模式&#xff0c;它定义了对象之间一对多的依赖关系&#xff0c;使得当一个对象状态改变时&#xff0c;其所有依赖对象&#xff08;观察者&#xff09;会自动收到通知并…