在 Visual Studio Linux 的代码中配置自定义 C++ 构建和 GDB 调试
Configuring a custom C++ build and GDB debug in Visual Studio Code for Linux
最近一直在用GDB调试一个C++程序。对于标准用法,我通常这样做:
$ cd compiledir
$ compilescript
$ gdb compiled.out
$ run inputfile
compilescript 是一个为我正在使用的特定软件编译代码的程序,并且只能在 compiledir 中运行。它读取编译器标志的外部文件。对于 gdb,我包含了必要的 -g 标志。这对我来说可以通过文本界面进行调试。但是,与 IDE 相比,此文本界面的使用越来越令人沮丧,而且我知道 Visual Studio 默认使用 gdb 作为后端来调试 C++ 文件。
开始,我让 visual studio 生成默认的 C++ 调试配置并尝试更改命令,但我不知道它在做什么,而且似乎没有太多关于制作自定义的文档build/debug 配置,特别是 linux 版本的 VScode。
目前我有:
launch.json(默认)
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "Custom Build",
"command": "compilescript" ,
"options": {
"cwd": "compiledir"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compile using the custom build script."
}
],
"version": "2.0.0"
}
运行 这个任务,以及 运行 通过 launch.json 文件间接地执行它都失败了。我得到以下信息:
> Executing task: Custom Build<
Starting build...
它挂在那里。我试图将 echo 放入构建命令中以查看它是否甚至 运行ning,或者让它创建一个文件。但是,好像什么都没有 运行,而且我在任何地方都看不到任何打印或正在创建的文件。
为 Visual Studio(Linux 版本)创建自定义 GDB build/debug 任务的正确方法是什么?
更新
我编辑了 tasks.json 和 launch.json,并且能够成功编译 运行 GDB 和我想要的输入文件。但是,环境变量配置不正确。我需要配置环境变量以正确 运行 输入文件。我目前有:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": compiled.out,
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [{"VAR1": "VAR1_VALUE", "VAR2": "VAR2_VALUE"}],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
但是,当我 运行 build/debug 任务时,它会构建,但不会调试,并且 GDB 会报错。似乎“环境”变量正在设置一些东西,但我收到以下错误:
Unable to start debugging. Unexpected GDB output from command "-interpreter-exec console "set env"". Argument required (environment variable and value).
这是您可以在不使用任何任务扩展的情况下在 C++ 中设置调试的方法。只需要 launch.json
文件。
首先,使用调试标志编译程序:-g
,并将其保存在文件夹中的任何位置。
例如在您的活动文件夹(或您当前打开的工作区文件夹)中,假设只有您的源代码存在
Program.cpp
# Other files...
使用 -g
标志编译您的程序并创建一个可执行文件,如下所示:
gcc -g Program.cpp -o a.out
如果你的编译成功,可执行文件a.out
会在文件夹中创建,你的根文件夹看起来像
a.out
Program.cpp
# Other files...
接下来,您需要创建 launch.json
文件。由于您没有使用任何任务扩展,您可以选择默认配置,这将创建大多数属性填充默认值的所述文件。
现在将launch.json中的程序路径编辑为这个可执行文件的路径。我还看到一些 Linux 操作系统的 VS Code 的 C++ 调试器存在一个错误,该错误不适用于内部控制台。所以您可能还需要将“外部控制台”选项设置为 true
在这种情况下,您将在 launch.json 文件中进行两次编辑,如
"configurations": [
{
#.... Other stuff
"program": "${fileDirname}/a.out",
#.... Other stuff
"externalConsole": true,
#.... Other stuff
}
]
}
这就是您所需要的。在程序中设置断点,然后使用调试面板中的按钮开始调试。一个外部控制台 window 将弹出 运行 你的程序,断点应该工作。
此外,如果您不熟悉一般调试,请记住,每次更改源代码(在本例中为 Program.cpp
)时,您都需要再次编译和构建可调试的可执行文件。如果你不这样做,你的调试就会出现故障。
编辑:
我看到你想添加环境变量。我有预感你做错了什么。
在我看来你想设置两个变量使得
VAR1 = VAR1_VALUE
VAR2 = VAR2_VALUE
您的 launch.json
文件中的语法不正确。应该如图所示:
#... Other stuff
"cwd": "${fileDirname}",
"environment":
[
{
"name": "VAR1", "value": "VAR1_VALUE"
},
{
"name": "VAR2", "value": "VAR2_VALUE"
}
],
"externalConsole": false,
#... Other stuff
最近一直在用GDB调试一个C++程序。对于标准用法,我通常这样做:
$ cd compiledir
$ compilescript
$ gdb compiled.out
$ run inputfile
compilescript 是一个为我正在使用的特定软件编译代码的程序,并且只能在 compiledir 中运行。它读取编译器标志的外部文件。对于 gdb,我包含了必要的 -g 标志。这对我来说可以通过文本界面进行调试。但是,与 IDE 相比,此文本界面的使用越来越令人沮丧,而且我知道 Visual Studio 默认使用 gdb 作为后端来调试 C++ 文件。
开始,我让 visual studio 生成默认的 C++ 调试配置并尝试更改命令,但我不知道它在做什么,而且似乎没有太多关于制作自定义的文档build/debug 配置,特别是 linux 版本的 VScode。
目前我有:
launch.json(默认)
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "Custom Build",
"command": "compilescript" ,
"options": {
"cwd": "compiledir"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compile using the custom build script."
}
],
"version": "2.0.0"
}
运行 这个任务,以及 运行 通过 launch.json 文件间接地执行它都失败了。我得到以下信息:
> Executing task: Custom Build<
Starting build...
它挂在那里。我试图将 echo 放入构建命令中以查看它是否甚至 运行ning,或者让它创建一个文件。但是,好像什么都没有 运行,而且我在任何地方都看不到任何打印或正在创建的文件。
为 Visual Studio(Linux 版本)创建自定义 GDB build/debug 任务的正确方法是什么?
更新 我编辑了 tasks.json 和 launch.json,并且能够成功编译 运行 GDB 和我想要的输入文件。但是,环境变量配置不正确。我需要配置环境变量以正确 运行 输入文件。我目前有:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": compiled.out,
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [{"VAR1": "VAR1_VALUE", "VAR2": "VAR2_VALUE"}],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
但是,当我 运行 build/debug 任务时,它会构建,但不会调试,并且 GDB 会报错。似乎“环境”变量正在设置一些东西,但我收到以下错误:
Unable to start debugging. Unexpected GDB output from command "-interpreter-exec console "set env"". Argument required (environment variable and value).
这是您可以在不使用任何任务扩展的情况下在 C++ 中设置调试的方法。只需要 launch.json
文件。
首先,使用调试标志编译程序:-g
,并将其保存在文件夹中的任何位置。
例如在您的活动文件夹(或您当前打开的工作区文件夹)中,假设只有您的源代码存在
Program.cpp
# Other files...
使用 -g
标志编译您的程序并创建一个可执行文件,如下所示:
gcc -g Program.cpp -o a.out
如果你的编译成功,可执行文件a.out
会在文件夹中创建,你的根文件夹看起来像
a.out
Program.cpp
# Other files...
接下来,您需要创建 launch.json
文件。由于您没有使用任何任务扩展,您可以选择默认配置,这将创建大多数属性填充默认值的所述文件。
现在将launch.json中的程序路径编辑为这个可执行文件的路径。我还看到一些 Linux 操作系统的 VS Code 的 C++ 调试器存在一个错误,该错误不适用于内部控制台。所以您可能还需要将“外部控制台”选项设置为 true
在这种情况下,您将在 launch.json 文件中进行两次编辑,如
"configurations": [
{
#.... Other stuff
"program": "${fileDirname}/a.out",
#.... Other stuff
"externalConsole": true,
#.... Other stuff
}
]
}
这就是您所需要的。在程序中设置断点,然后使用调试面板中的按钮开始调试。一个外部控制台 window 将弹出 运行 你的程序,断点应该工作。
此外,如果您不熟悉一般调试,请记住,每次更改源代码(在本例中为 Program.cpp
)时,您都需要再次编译和构建可调试的可执行文件。如果你不这样做,你的调试就会出现故障。
编辑:
我看到你想添加环境变量。我有预感你做错了什么。
在我看来你想设置两个变量使得
VAR1 = VAR1_VALUE
VAR2 = VAR2_VALUE
您的 launch.json
文件中的语法不正确。应该如图所示:
#... Other stuff
"cwd": "${fileDirname}",
"environment":
[
{
"name": "VAR1", "value": "VAR1_VALUE"
},
{
"name": "VAR2", "value": "VAR2_VALUE"
}
],
"externalConsole": false,
#... Other stuff