赞
踩
运行环境:
vscode version:1.86.2
ubuntu 22.04桌面版
g++/gcc 版本:12.3.0-1ubuntu1~22.04
最初的对应的文件树形结构为:
目前.vscode文件夹中无任何内容
点击vsode的最左侧状态栏中的"运行和调试",然后点击"创建launch.json文件",随后会自动生成launch.json文件,如下图所示:
然后在上图所示的launch.json文件的右下角会有个"添加配置",点击它,随后在弹出的选择项中点击选择"C/C++(gdb)启动"即可.如下图所示:
上图第二步点击后会自动得到如下所示的内容(记得Ctrl+S保存下):
准备工作:创建一个和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}:传入输入变量 */
点击vscode上方的"终端",然后再点击"配置默认生成任务",再在弹出的选择框中任意选择一个,就可以自动生成一个初始的task.json了,如下所示:
修改这个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 } } ] }
在修改上面的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 } ] } ] }
我的main.cpp的示例代码如下:
#include<iostream>
int main()
{
std::cout << "hello world!!!" << std::endl;
printf("=========%d\n",100);
return 0;
}
然后下一个断点,之后按F5(或者vscode上面栏中的"运行"–>“启动调试”):
到此所有的配置结束.
一个注意点:我在网上搜索教程时看到到大部分都是将"preLaunchTask" 加到"configurations"数组之后的,但是我这样做之后就会出问题,实际上应该加在"configurations"数组中的这个唯一的元素中才行.
即如果你这样添加:
那么还是下一个断点,之后按F5(或者vscode上面栏中的"运行"–>“启动调试”),会得到这样的一个错误:
调试过程中如何查看对应的汇编代码呢?
首先先进入到调试中(下一个断点,之后按F5(或者vscode上面栏中的"运行"–>“启动调试”)),然后找到这个位置:
然后再点击"…"处来将下面这些内容都勾选上(其实只需要勾选中其中的"调用堆栈"即可,把其他的勾选上会更好):
有两种方式可以来查看对应的反汇编代码:
这种方式看到的反汇编代码是跟随着断点的,即看到的反汇编代码是在断点所在处的附近的.
这样来查看:
先点击其中的"调用堆栈":
此时会看到有个main()/main.cpp的一项,右键并点击"打开反汇编试图":
然后就可以看到断点附近的反汇编代码了:
这种方式采用命令行的方式来查看汇编代码,这种方式基本上看到的是整个函数的反汇编代码.
同样也是需要进到调试模式下,然后把调试终端打开:
打开后会在终端处自动新增一项"调试控制台":
这个调试终端实际上就是一个集成了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:显示当前函数的参数。
上面这些指令是GDB(GNU Debugger)的常用命令,通常用来在命令行界面中与GDB交互。你列出的每个命令都对应GDB的一个特定功能。在某些集成开发环境(IDE)或其他调试环境中,可能需要在GDB命令前加上
-exec
前缀来指示这些命令应当被发送到GDB处理,而不是由IDE自己处理。在没有IDE环境的纯GDB命令行中,通常不需要
-exec
前缀,直接输入命令(例如disassemble /m main
或info r
)即可。
示例执行一个例子:
执行-exec disassemble /m main命令的结果如下:
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
如需转载请注明出处.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。