【问题标题】:Configuring a custom C++ build and GDB debug in Visual Studio Code for Linux在 Visual Studio Code for Linux 中配置自定义 C++ 构建和 GDB 调试
【发布时间】:2021-08-31 20:49:15
【问题描述】:

我最近一直在使用 GDB 调试 C++ 程序。对于标准用法,我通常这样做:

$ cd compiledir
$ compilescript 
$ gdb compiled.out
  $ run inputfile

compilescript 是一个为我正在开发的特定软件编译代码的程序,并且只在 compiledir 中工作。它读取编译器标志的外部文件。对于 gdb,我包括 neccisary -g 标志。这适用于我通过文本界面进行调试。但是,与 IDE 相比,这个文本界面的使用变得越来越令人沮丧,而且我知道 Visual Studio 默认使用 gdb 作为后端来调试 C++ 文件。

首先,我让 Visual Studio 生成默认的 C++ 调试配置并尝试更改命令,但我不知道它在做什么,而且似乎没有太多关于制作自定义构建/调试配置的文档,特别是对于 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 放入构建命令中以查看它是否正在运行,或者让它创建一个文件。然而,就好像什么都没有运行,我在任何地方都看不到任何打印或创建的文件。

为 Visual Studio(Linux 版)创建自定义 GDB 构建/调试任务的正确方法是什么?

更新 我已经编辑了 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"
        }
    ]
}

但是,当我运行构建/调试任务时,它会构建,但不会调试,并且 GDB 会报错。似乎“环境”变量正在设置一些东西,但我收到以下错误:

Unable to start debugging. Unexpected GDB output from command "-interpreter-exec console "set env"".  Argument required (environment variable and value).

【问题讨论】:

  • 您没有在launch.json 中运行“自定义构建”任务。
  • Here 是关于tasks.json 的通用信息(我实际上只是搜索了tasks.json)。使用该页面上的导航树,我得到this 和this。

标签: debugging visual-studio-code gdb


【解决方案1】:

这是您无需使用任何任务扩展即可在 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 中的程序路径编辑为该可执行文件的路径。我还看到,对于 VS Code 的 C++ 调试器,某些 Linux 操作系统存在一个错误,该错误不适用于内部控制台。因此,您可能还需要将“外部控制台”选项设置为 true

在这种情况下,您将在您的 launch.json 文件中进行两次编辑

    "configurations": [
        {
            #.... Other stuff

            "program": "${fileDirname}/a.out",
            
            #.... Other stuff

            "externalConsole": true,

            #.... Other stuff
        }
    ]
}

这就是你所需要的。在程序中设置断点,然后使用调试面板中的按钮开始调试。运行您的程序时会弹出一个外部控制台窗口,并且断点应该可以工作。

此外,如果您是一般调试的新手,请记住,每次更改源代码(在本例中为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

【讨论】:

  • 谢谢!这对我帮助很大!我的问题与这个调试案例有点不同,我不确定 Visual Studio 是否可以适应它。我需要通过调用特定程序而不是 g++ 来构建我的更改。我可以在外部执行此操作,但在 Visual Studio 中执行此操作会更好。使用此配置,它会尝试构建当前文件,然后运行调试器,但它会尝试构建当前文件而不是运行所需的构建作业。
  • @stillQuestioning 在这种情况下,您需要将当前的“preLaunchTask”属性编辑为您的调试说明。在您的情况下,它正在调试“当前文件”,因为这是您在 launch.json 文件中设置的内容。检查“preLanuchTask”属性的 VS Code 的 this StackOverflow answer 或 this doc。
  • 再次感谢您的帮助!您的回答帮助我非常接近解决方案。我最近再次更新了我的问题以显示我所拥有的。我在让环境变量与 launch.json 中的 GDB 和 Visual Studio 调试器一起工作时遇到了一些麻烦,但我很确定这是让这个自定义调试配置工作的最后一步。你知道是什么导致了这个问题吗?
  • @stillQuestioning 我看到了你的编辑,我已经编辑了我的答案来解决它们。希望这是你需要的
猜你喜欢
  • 1970-01-01
  • 2016-12-26
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多