Visual Studio 2022 CMake+MinGW+GDB 调试目标程序

news2024/11/24 20:07:30

前段时间笔者在使用MinGW编译了QtCreator后,想要进行调试。最开始使用VSCode进行调试,可是可以调试,但是发现调试过程中反应比较慢,毕竟QtCreator整个源代码工程还是非常大的,VSCode是由JS语言编写,执行效率肯定比不上C/C++。于是想使用Visual Studio 2022进行调试,但是Visual Studio 2022下使用CMake+MinGW+GDB的配置比VSCode复杂一些,参见笔者前面的博文Visual Studio 2022使用MinGW来编译调试C/C++程序,该中是使用的非常简单的示例项目,即生成目标在根CMakeList.txt中,而QtCreator是子目录中的目标,搞了很久愣是没配置出来,网上各种查资料,各种尝试,还没是搞定。于是在Github上发Issue进行询问,Visual Studio 2022 CMake+MinGW+GDB cannot debug target,到目前为止还没任何回复,可能是由于当初标签打错了(搞成C++23),导致暂时没关注过来。

今天笔者又想调试一下QtCreator了,还是想使用Visual Studio 2022 CMake+MinGW+GDB的方式,于是又在网上各种查资料,各种尝试,终于成功了。即使深夜了也还是决定发文出来分享给大家,独乐乐不如众乐乐。

要想在Visual Studio 2022中使用CMake+MinGW+GDB的方式调试程序,需要配置launch.vs.json,具体的配置项可以参考官方文档launch.vs.json 架构参考 (C++)和配置 CMake 调试会话。

最主要的属性配置项为:

属性说明
name指定“启动项”下拉列表中条目的名称。
projectTarget指定生成project 时调用的可选目标。 目标必须与“启动项”下拉列表中的名称匹配。
project指定项目文件的相对路径。 通常,调试CMake项目时不需要更改此值。
program要执行的调试命令。 默认为 “${debugInfo.fullTargetPath}”。
type配置类型,可以是“default”,“cppdbg”和“cppgdb”
MIMode指示 MIDebugEngine 将连接到的已启用 MI 的控制台调试程序的类型。 允许的值为 “gdb”、“lldb”。
miDebuggerPath启用 MI 的调试程序(例如 gdb)的路径。 如果未指定,它将首先搜索调试程序的路径。

后面三项都比较容易配置,根据说明,最容易犯错的是前面四项,特别是前面两项,因为根据说明比较搅。projectTarget必须与name匹配,这个匹配是指完全配置成一样吗?根据网上大多数资料,都是配置成一样的,因为都是在根CMakeLists.txt中的目标;project项目文件相对路径,CMake项目不需要更改,即原来是CMakeLists.txt,不管它;program是最容易被忽略的,因为根据说明默认为 “${debugInfo.fullTargetPath}”,这个宏由于不方便看到值,所以很容易以为会自动根据前面的配置匹配到目标,其实不然。

根据笔者尝试成功后发现,nameprojectTarget可以配置成不同的字符串,name用于显示在“启动项”下拉列表中,而projectTarget一定是与CMake中的目标名字必须完全匹配,program需要配置成可执行文件的绝对路径或者相对于cwd配置中的路径

本文链接:https://blog.csdn.net/witton/article/details/130674898

下面是成功调试的画面:

在这里插入图片描述

下面给出完整配置:

{
  "version": "0.2.1",
  "defaults": {},
  "configurations": [
    {
      "type": "cppdbg",
      "name": "Qt",
      "project": "CMakeLists.txt",
      "projectTarget": "qtcreator",
      "cwd": "${workspaceRoot}",
      "program": "out/build/Mingw64-Debug/bin/qtcreator.exe",
      "MIMode": "gdb",
      "miDebuggerPath": "gdb.exe",
      "externalConsole": true
    }
  ]
}

可以看到nameprojectTarget配置成了不同的字符串,program一定要配置成绝对路径或者相对于cwd的路径,projectTarget配置成与CMake目标完全一致的字符串,注意没有.exe后缀,笔者之前尝试无数次失败的原因就是这个:

在这里插入图片描述

因为CMakeLists.txt中的目标就没有.exe后缀。

笔者能够成功是受益于官方的一博文Debugging Linux CMake Projects with gdbserver,它配置的nameprojectTarget不同,还配置了program为绝经路径。该博文的介绍如何使用Visual Studio+CMake+GDB的方式远程调试Linux程序,后面得空尝试一下。

深夜码字不易,如果对你有帮助,请点赞收藏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang每日一练(leetDay0065) 位1的个数、词频统计

目录 191. 位1的个数 Nnumber of 1-bits 🌟 192. 统计词频 Word Frequency 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…

Java面试知识点(全)-JVM面试知识点一

[Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 SQL优化 r m y s q l q u e r y ( " S E L E C T u s e r n a m e F R O M u s e r W H E R E s i g n u p d a t e > ′ r mysql_query(…

RK3568平台开发系列讲解(网络篇)图解linux ping

🚀返回专栏总目录 文章目录 一、SOCK_RAW套接字实现的ping二、ping命令发送端内核实现三、ping命令接收端内核实现沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 ping 命令采用 ICMP 协议,是一个用户空间程序,它打开一个 SOCK_RAW 套接字或者ICMP套接字发送ICMP_…

Chrome启动参数常用参数

Chrome常用参数请参考下表。 序号 参数 说明 1 --allow-outdated-plugins 不停用过期的插件。 2 --allow-running-insecure-content 默认情况下,https 页面不允许从 http 链接引用 javascript/css/plug-ins。添加这一参数会放行这些内容。 3 …

Python爬虫入门教程,BeautifulSoup基本使用及实践

Python爬虫入门教程,BeautifulSoup基本使用及实践 爬虫,是学习Python的一个有用的分支,互联网时代,信息浩瀚如海,如果能够便捷的获取有用的信息,我们便有可能领先一步,而爬虫正是这样的一个工具…

大数据之PySpark的RDD创建和分区

文章目录 前言一、RDD创建二、RDD分区数总结 前言 #博学谷IT学习技术支持# 上篇文章对PySpark的RDD做了简单的介绍,以及总结了RDD的特性,该篇文章主要介绍RDD的创建方式,PySpark的RDD创建方式主要有两种,一种是在程序中直接创建&…

11 dubbo源码学习_dubbo协议通信

dubbo在通信上也支持非常多的网络协议,而dubbo协议属于dubbo框架自研,整体协议也比较有代表性,采用定长协议头+变长协议休的形式; 1. dubbo协议格式 Magic - Magic High & Magic Low (16 bits)标识协议版本号,Dubbo 协议:0xdabbReq/Res (1 bit)标识是请求或响应。请…

「OceanBase 4.1 体验」|OCP Express

文章目录 一、简介二、特性介绍2.1 数据库管理2.2 数据库可观测性 一、简介 OCP Express 是一个基于 Web 的 OceanBase 4.x 轻量化管理工具,作为 OceanBase 数据库的工具组件,它集成在 OceanBase 数据库集群中,支持数据库集群关键性能指标查看…

MyBatis第一章 搭建MyBatis的运行环境

这里写自定义目录标题 一 创建Maven工程1 打包方式设置为jar2 引入依赖进去 二 创建MyBatis的核心配置文件1 配置核心文件2 创建mapper接口3 创建mabatis的映射文件4 测试文件的写法5 需要代码可以访问gitee仓库去看看6 log4j的日志功能 三 先改方法,后改映射文件1 …

Qt开发笔记(Qt5.9.9下载安装环境搭建win10)

#1 Qt下载网站(国内、国外镜像) #2 Qt5.9.9安装选项 #3 配置系统环境变量 #4 创建测试项目 #1 Qt下载网站(国内、国外镜像) 官方下载地址(慢):http://download.qt.io/ 国内镜像网站 这里给大家…

私有jar包发布到maven中央仓库

一、注册Jira Sonatype JIRAhttps://issues.sonatype.org/secure/Dashboard.jspa 二、新建issue 提交后,等待5-10分钟,会收到中央机器人的评论,如下: 在这里,我没有自己的域名,此时: 1、机器人…

网络编程 lesson2 TCP基础编程

目录 sockt介绍 socket类型 socket所在位置 端口号(重点) 端口号作用 端口号范围 字节序(面试常见) 大端序 小端序 验证当前主机字节序 字节序转换和IP转换函数接口(常用) TCP编程 函数接口 …

[230517] TPO71 | 2022年托福阅读真题第5/36篇 | Minoan Palaces | 14:51~16:00+22:00~23:20

7102 Minoan Palaces 目录 7102 Minoan Palaces 正文 题目 Paragraph 1 问题 1 Paragraph 2 问题 2 Paragraph 3 问题 3 4 Paragraph 4 问题 5 6 Paragraph 5 问题 7 8 Paragraph 2-问题9 全篇-问题10 正确率:7/10 正文 Paragraph 1 The…

JavaScript实现输入指定行数,输出三角形的代码

以下为实现输入指定行数,输出三角形的程序代码和运行截图 目录 前言 一、实现输入指定行数,输出三角形 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找;…

HCIP周日ISIS

ISIS:中间系统到中间系统 ES:终端系统 ES-IS:终端系统到中间系统 ISIS是一种链路状态协议,使用SPF算法 早期的ISIS是基于CLNP(无连接网络协议)而开发的,为了继续追逐TCP/IP的发展&#xff0…

关于getchar的用法及实例解析

一、getchar()函数是什么? getchar()函数是获取一个字符。说到这里就有人问了,为什么他的返回类型是int? 因为实际上EOFend of file(-1),EOF实际上就等于-1。当你返回失败的时候返回的是-1,所以…

计算机网络(四上)——网络层!!!重中之重

先来个整章的大框架,看起来也没有多少东西(bushi)。 这篇文章,就先写 一、网络层的功能 互联网在网络层的设计思路是,向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务 1.1.异构网络互联 1.网络互联是…

Springboot +Flowable,流程表单应用之动态表单

一.简介 整体上来说,我们可以将Flowable 的表单分为三种不同的类型: 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息,不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…

kafka 从入门到精通

kafka 从入门到精通 安装 zookeeper模式 创建软件目录 mkdir /opt/soft cd /opt/soft下载 wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz解压 tar -zxvf kafka_2.13-3.4.0.tgz 修改目录名称 mv kafka_2.13-3.4.0 kafka配置环境变量 vim /etc/pr…

C51基础之单片机编程中通用指针和定向指针

通用指针和定向指针 参考资料:Keil > Help > uVision Help > Cx51 Compiler User’s Guide > Language Extensions > Pointers 一、Cx51指针的几种用法 int *ptr; /* 指向:任意空间的int变量, 存储在&…