当前位置:   article > 正文

VSCODE C++调试环境配置_vscode配置c++调试环境

vscode配置c++调试环境

VSCODE C++调试环境配置

运行环境:

vscode version:1.86.2

ubuntu 22.04桌面版

g++/gcc 版本:12.3.0-1ubuntu1~22.04

最初的对应的文件树形结构为:

目前.vscode文件夹中无任何内容

launch.json创建与配置

点击vsode的最左侧状态栏中的"运行和调试",然后点击"创建launch.json文件",随后会自动生成launch.json文件,如下图所示:

然后在上图所示的launch.json文件的右下角会有个"添加配置",点击它,随后在弹出的选择项中点击选择"C/C++(gdb)启动"即可.如下图所示:

上图第二步点击后会自动得到如下所示的内容(记得Ctrl+S保存下):

launch_json_operate3

准备工作:创建一个和src同级的middle_out文件夹(存放用于调试的经过预处理、编译、汇编以及链接的最终可执行文件*.out.这个文件其实本质和使用g++指令编译得到的可执行文件或者使用CMakeLists.txt文件来进过cmake …和make得到的可执行文件是一样的.为了和这两者生成的文件不混在一起,所以单独创建一个文件夹来进行存放).此时的文件树形结构为:

现在来对这个launch.json文件进行解释以及配置修改,解释及说明如下:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",// 表示 launch.json 配置文件的版本号。VSCode 使用这个版本号来确定如何解析和使用文件中的配置。
    "configurations": // 配置数组,每个元素定义了一个特定的调试配置。你可以设置多个配置来支持不同的调试场景(例如,不同的程序或不同的调试类型)。
    [

        {// 数组元素1
            "name": "(gdb) 启动",// 配置的显示名称,会出现在 VSCode 的调试启动配置菜单中。这里的名称表示这是使用 GDB 进行的调试启动配置
            "type": "cppdbg",// 指定调试器类型。cppdbg 是 C/C++ 调试器的标识符,表示这个配置是用于调试 C 或 C++ 程序。
            "request": "launch",// 指示调试会话的启动类型。launch 表示 VSCode 将启动并调试一个程序。另一种类型是 attach,表示附加到一个已经运行的进程。
            // "program": "输入程序名称,例如 ${workspaceFolder}/a.out", // 指定要调试的可执行文件的路径
            "program": "${workspaceFolder}/middle_out/a.out",
            "args": [],// 一个字符串数组,包含传递给程序的命令行参数
            "stopAtEntry": false,// 指定调试器是否在程序入口点暂停。false 表示不在程序开始时自动停止。
            "cwd": "${workspaceFolder}/src",// 设置程序的当前工作目录。${fileDirname} 是当前打开文件的目录路径.配置的和"program"中的目录一样即可,注意是目录
            "externalConsole": false,// 指定是否使用外部控制台窗口来运行调试程序。false 表示在 VSCode 的内部终端中运行
            "MIMode": "gdb",// 指定调试器接口模式,gdb 表示使用 GNU Debugger。
            "miDebuggerPath":"/usr/bin/gdb", // miDebugger的路径,注意这里要与gdb的路径对应
            "setupCommands": 
            [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]// setupCommands: 一个命令数组,用于配置调试器的初始设置。这些命令在启动调试会话时自动执行。
             // "-enable-pretty-printing" 使 GDB 的输出更易于阅读。
             // "-gdb-set disassembly-flavor intel" 设置反汇编视图使用的语法为 Intel 语法,而非默认的 AT&T 语法。
        }


    ]
}

/*
vscode配置文件(如 tasks.json 和 launch.json)中常用的变量:
${workspaceFolder} :代表你当前打开的工作区(Workspace)的根目录。如果你有多个工作区文件夹,它指的是当前活动文件所属的工作区文件夹的根目录
${file} :当前在编辑器中打开的文件的完整路径
${fileWorkspaceFolder} :当前打开文件所属的工作区文件夹路径
${fileDirname} :当前在编辑器中打开的文件所在的目录的路径
${fileBasename} : 当前在编辑器中打开的文件的基本文件名,包括文件扩展名。
${fileBasenameNoExtension} :当前在编辑器中打开的文件的基本文件名,但不包括文件扩展名
${fileExtname} :当前在编辑器中打开的文件的文件扩展名
${relativeFile} :当前打开文件相对于 ${workspaceFolder} 的路径
${relativeFileDirname} :当前打开文件的目录相对于 ${workspaceFolder} 的路径
${lineNumber} :当前编辑器光标所在的行号
${selectedText} :当前在编辑器中选中的文本
${execPath} :VSCode 可执行文件的路径

${workspaceFolderBasename}:在Visual Studio Code中打开的文件夹名
${cwd}:Task启动时的工作目录
${defaultBuildTask}:默认的Build Task的名字
${env:Name}:引用环境变量
${config:Name}:可以引用Visual Studio Code的设置项
${input:variableID}:传入输入变量
*/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

tasks.json配置与创建

点击vscode上方的"终端",然后再点击"配置默认生成任务",再在弹出的选择框中任意选择一个,就可以自动生成一个初始的task.json了,如下所示:

task_json_operate1

image-20240224155414672

image-20240224155925067

修改这个task.json来对应配置完成"g++ 生成活动文件"任务.修改如下:

{	// 按下 Ctrl+Shift+B 会触发你的构建任务(即本tasks.json文件), 可以用这个指令/按键来单独确认tasks.json是否有问题
	"version": "2.0.0",
	"tasks": 
	[
		{
			"type": "cppbuild",
			"label": "C/C++: g++ 生成活动文件",
			"command": "/usr/bin/g++",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"main.cpp",// 对应下面的options中的cwd所指定的那个目录下的文件.
				           // 如果还有其他的.cpp文件,也需要填写到此处
				"-o",
				"${workspaceFolder}/middle_out/a.out" //生成的用于调试的可执行程序的完整路径 
			],
			"options": {
				"cwd": "${workspaceFolder}/src" // .cpp文件所在的目录路径
			},
			"problemMatcher": [
				"$gcc"
			],
			"detail": "编译器: /usr/bin/g++",
			"group": {
				"kind": "build",
				"isDefault": true
			}
		}
	]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在修改上面的launch.json文件的内容:(注意是launch.json文件啊)

​ 将之前生成的launch.json与现在的task.json进行对比, 先在launch.json中加一行代码"preLaunchTask",这行代码意思就是在launch之前运行的任务名,这个名字一定要跟tasks.json中的任务名字(label)写一致, tasks.json中的label要和launch.json中的preLaunchTask完全一致,因为在执行launch.json之前系统会根据这行代码先去执行tasks.json中的内容,可以简单理解为tasks.json中的代码会帮我们用g++/gcc编译生成可执行文件,而launch.json中的代码是让系统来调试我们的可执行文件.

修改后的launch.json最终的内容(已去掉注释)如下:

{
    "version": "0.2.0",
    "configurations": 
    [
        
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/middle_out/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/src",
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath":"/usr/bin/gdb",
            "preLaunchTask": "C/C++: g++ 生成活动文件", // 调试会话开始前执行的任务
            "setupCommands": 
            [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }

    ]
    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

运行

​ 我的main.cpp的示例代码如下:

#include<iostream>

int main()
{
    std::cout << "hello world!!!" << std::endl;
    printf("=========%d\n",100);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

​ 然后下一个断点,之后按F5(或者vscode上面栏中的"运行"–>“启动调试”):

image-20240225174326347

​ 到此所有的配置结束.

额外1

​ 一个注意点:我在网上搜索教程时看到到大部分都是将"preLaunchTask" 加到"configurations"数组之后的,但是我这样做之后就会出问题,实际上应该加在"configurations"数组中的这个唯一的元素中才行.

​ 即如果你这样添加:

image-20240225173937851

​ 那么还是下一个断点,之后按F5(或者vscode上面栏中的"运行"–>“启动调试”),会得到这样的一个错误:

image-20240225174531841

额外2

​ 调试过程中如何查看对应的汇编代码呢?

​ 首先先进入到调试中(下一个断点,之后按F5(或者vscode上面栏中的"运行"–>“启动调试”)),然后找到这个位置:

image-20240225181238386

​ 然后再点击"…"处来将下面这些内容都勾选上(其实只需要勾选中其中的"调用堆栈"即可,把其他的勾选上会更好):

image-20240225182454932

有两种方式可以来查看对应的反汇编代码:

1.直接在vscode中查看

​ 这种方式看到的反汇编代码是跟随着断点的,即看到的反汇编代码是在断点所在处的附近的.

这样来查看:

​ 先点击其中的"调用堆栈":

image-20240225183221465

​ 此时会看到有个main()/main.cpp的一项,右键并点击"打开反汇编试图":

image-20240225202543730

​ 然后就可以看到断点附近的反汇编代码了:

image-20240225202830706

2.终端输入指令查看

​ 这种方式采用命令行的方式来查看汇编代码,这种方式基本上看到的是整个函数的反汇编代码.

​ 同样也是需要进到调试模式下,然后把调试终端打开:

image-20240225203156442

打开后会在终端处自动新增一项"调试控制台":

image-20240225203307563

这个调试终端实际上就是一个集成了GDB的调试终端。而额外的 -exec 命令是IDE用来区分它自己的命令和需要传递给GDB的命令。所以,当你想在这个终端中执行一个GDB特定的命令时,你需要在它前面加上 -exec。例如,如果你想执行GDB的 run 命令,你就在这个终端中输入 -exec run

在上图的第二个箭头所示的区域就可以执行一些指令了,例如:

-exec disassemble /m main:显示 main 函数的混合汇编/源代码(如果可用)。
-exec info r:列出所有寄存器的当前值。
-exec print s:打印变量 s 的值。
-exec print $pc:打印程序计数器(PC,即当前执行指令的地址)的值。
-exec bt:显示当前线程的回溯(函数调用堆栈)。
-exec info f:显示有关当前栈帧的信息。
-exec si:执行单步执行,进入下一条指令(汇编级别)。
-exec info local:列出当前栈帧的所有局部变量的值。
-exec info args:显示当前函数的参数。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

上面这些指令是GDB(GNU Debugger)的常用命令,通常用来在命令行界面中与GDB交互。你列出的每个命令都对应GDB的一个特定功能。在某些集成开发环境(IDE)或其他调试环境中,可能需要在GDB命令前加上 -exec 前缀来指示这些命令应当被发送到GDB处理,而不是由IDE自己处理。

在没有IDE环境的纯GDB命令行中,通常不需要 -exec 前缀,直接输入命令(例如 disassemble /m maininfo r)即可。

示例执行一个例子:

​ 执行-exec disassemble /m main命令的结果如下:

image-20240225210936536

额外3

ps: 遇到一个特殊问题,在上面的配置过程中,突然发现在vscode中无法编辑上面的launch.json,其原因是我在vsode中安装了Vim的拓展,将它禁用后重启vscode就能正常编辑了。其实如果不禁用Vim插件的话,是可以按照使用Vim那样来编辑文件的,即默认是命令模式,需要输入a或者i来进入到输入模式才能编辑。

本文章大部分内容参考自:

博客1: https://blog.csdn.net/qq_59084325/article/details/125662393

博客2:https://blog.csdn.net/tabactivity/article/details/135474111

​ 如需转载请注明出处.

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&