前段时间笔者在使用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}”,这个宏由于不方便看到值,所以很容易以为会自动根据前面的配置匹配到目标,其实不然。
根据笔者尝试成功后发现,name
与projectTarget
可以配置成不同的字符串,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
}
]
}
可以看到name
与projectTarget
配置成了不同的字符串,program
一定要配置成绝对路径或者相对于cwd
的路径,projectTarget
配置成与CMake目标完全一致的字符串,注意没有.exe
后缀,笔者之前尝试无数次失败的原因就是这个:
因为CMakeLists.txt中的目标就没有.exe
后缀。
笔者能够成功是受益于官方的一博文Debugging Linux CMake Projects with gdbserver,它配置的name
与projectTarget
不同,还配置了program
为绝经路径。该博文的介绍如何使用Visual Studio+CMake+GDB的方式远程调试Linux程序,后面得空尝试一下。
深夜码字不易,如果对你有帮助,请点赞收藏。