linux (ubuntu)下 用vs code 调试 c++程序

时间:2022-03-11 09:16:23


曾经多次学习在ubuntu下用vs code调试c++程序,最终都因各种原因以失败而告终。迫不得已,昨天下定决心再次尝试,最终终于成功了。这里想做一个简单的记录。

PS:不得不吐槽一下网上各种教程,多数都是直接复制别人的,根本没有更据自己的实践对教程做一定的修改或补充说明。



首先,需要安装vs code 里面的c/c++插件,并且通过终端命令:sudo apt-get install build-essential  安装各种依赖。


其次,添加调试配置文件:launch.json。添加好调试配置文件后,(只)需要将其中的(两处)“program”节点修改为“"${workspaceRoot}/编译文件名"。编译文件名是你对源文件进行编译后生成的编译文件的名称,例如下面的”Test.out“。最终编译出来的编译文件的名称也可以不带后缀”out"。

{
"version": "0.2.0",
"configurations": [
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/Test.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"linux": {
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
},
{
"name": "C++ Attach",
"type": "cppdbg",
"request": "attach",
"program": "${workspaceRoot}/Test.out",
"processId": "${command:pickProcess}",

配置好调试配置文件后,按 F5 进行调试会出错,因为还没有生成编译文件。调试是针对编译文件调试的,没有编译文件当然无法进行调试。有两中方式生成编译文件:1.通过在终端输入命令进行编译生成编译文件。   2.先配置好编译配置文件,然后通过快捷键进行编译。

 个人倾向于第一种,因为通常情况下,我们都是先编译生成编译文件再执行编译文件,只有在编译时出错但无法直接找到错误原因 或者 能顺利编译,但执行结果与预期不符时才会进行调试。这样,编译和执行都可以直接在终端上输入命令一气呵成。若采用第二种方式,通过按快捷键编译后,依然需要在终端输入命令进行执行。下面我会将两种方式都做一个说明。


其一,通过在终端输入命令进行编译生成编译文件。


vs code自身就集成了终端,且其会自动cd 到了当前源文件所在文件目录,而不需要去打开系统终端,再输入cd命令。这点可以说非常方便。

假设对源文件“Test.cpp”进行编译,那么编译命令就是:“g++ -g Test.cpp -o Test.out”。其中“Test.out”是编译文件名,可以任意自定义。例如,如果想编译文件名不带“out”后缀名“,那么编译命令就是:”g++ -g Test.cpp -o Test” 。

如果想对两个源文件联合编译,例如两个源文件分别为:“Test.cpp”和“Array.cpp”,此外当然应该还有一个自定义头文件,假设为“Test.h"。那么编译命令就是:“g++ -g Test.cpp Array.cpp -o Test.out"。

关于如何写编译命令,这里不再赘述。不过,值得注意的是,编译命令中一定要带 “-g" 的参数,否则无法对编译文件进行调试(“-g" 参数作用是在编译的时候,产生调试信息)。



其二,通过按快捷键Ctrl+Shift+B进行编译


首先同样需要配置 编译配置文件。在vs code界面,按快捷键 Ctrl + Shift + P,然后在跳出的输入框内输入”tasks“,然后点击选择第一个选项(即:任务:配置任务运行程序),然后 选择 ”其他“。这样就会生成一个”task.json“的文件。将其修改为如下图表示(可以忽略注释信息):

{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "0.1.0",
"command": "g++", //这里将”echo"修改为“g++"
"isShellCommand": true,
"args": [ //这里是编译参数,和 编译命令 中参数一一对应就行了
"-g", //生成调试信息
"${workspaceRoot}/Test.cpp", //源文件一
"${workspaceRoot}/Array.cpp", //源文件二(可省略)
"-o", //编译参数
"${workspaceRoot}/Test.out" //生成的目标文件(编译文件),其名字要与调试配置文件:launch.json中的名字相同
],
"showOutput": "always"
}


配置好后,按快捷键Ctrl+Shift+B 就可以对源文件进行编译并生成编译文件。这里,同样要注意的是: 源文件的路径上不能有中文名(例如,在ubuntu系统中源文件就不能放在 桌面 文件 图片 等中文名的文件下),否则即便成功生成了编译文件,在调试时也会出现 "找不到...文件" 的错误提示。



这样,正常情况下,先对源文件打上断点,然后通过上面其中一种方式生成编译文件后,就可以按 F5 顺利进入调试了。