前段时间笔者在使用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

下面是成功调试的画面:

下面给出完整配置:

 1{
 2  "version": "0.2.1",
 3  "defaults": {},
 4  "configurations": [
 5    {
 6      "type": "cppdbg",
 7      "name": "Qt",
 8      "project": "CMakeLists.txt",
 9      "projectTarget": "qtcreator",
10      "cwd": "${workspaceRoot}",
11      "program": "out/build/Mingw64-Debug/bin/qtcreator.exe",
12      "MIMode": "gdb",
13      "miDebuggerPath": "gdb.exe",
14      "externalConsole": true
15    }
16  ]
17}

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

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

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

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