VS code在Win10和Ubuntu下C++的debug调试方法

最近在看CS:APP,由于vscode中集成了终端,而且win10下的wsl在安装了图形界面之后,使用vscode不要太爽。

vscode是可以使用debug的,但是需要自己设置一下,这里有官方的文档https://code.visualstudio.com/docs#vscode可以参考(你也可以在vscode菜单栏->帮助->文档中打开)。但是微软介绍的内容可以使用但是很繁琐(这很巨硬),我花费了一个下午的时间,在win10下使用明白了,接着就去Ubuntu下尝试了下,但是微软的文档中没有Linux下的配置过程,只有在wsl下的使用方法(说好的Microsoft Love Linux呢!)。

我只好再安装了clang和lldb后使用mac下的内容尝试了下,这时机缘巧合下发现了本文要介绍的方法。

再次吐槽下,Ubuntu下的操作非常简单,Win10下就呵呵了,所以就先讲Ubuntu下的操作。

好了,扯了这么多下面上正题。

--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------

  • Ubuntu下的操作

Ubuntu下相比Windows下简单很多,你只需要安装好你需要的软件,环境基本就建好了。

1、环境准备

安装gcc和g++,18.04之后出现了最小安装模式,只有基本的内核和必要的工具,gcc和g++的工具基本上是没有安装的,需要手动安装一下

sudo apt-get install gcc g++

安装之后,可以检验一下是否安装成功了

leewwe@leewwe:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 
leewwe@leewwe:~$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 

2、在vscode中安装调试

(1)打开一个文件夹

 

(2)新建cpp源代码

示例代码

//helloworld.cpp
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
    
    return 0;
}

 

(3)按Ctrl+Alt+P启动命令面板 或者 菜单栏->查看->命令面板

输出的样子可能有区别,我这个是用过的,所以会推荐出我最近使用的内容。

 

(4)在输入栏里出入c/c++(大小写都行),向下滚轮,找到如下两个内容

C/C++:编辑配置(UI)[C/C++:Edit Configuration(UI)]

C/C++:编辑配置(JSON)[C/C++:Edit Configuration(JSON)]

注意没点的时候的绿色框

UI就是使用一个简单的UI来编写你的.json配置文件,和使用JSON的方法本质是一样的,只不过JSON的方法更加灵活,可调项更多

点击后会得到下面的图

注意绿色的框,我们出现了.vscode隐藏文件夹,里面就存放着我们的配置文件操作到这不会出现一个名叫c_cpp_properties.json的我文件,这个就是软件帮我们创建好的配置文件末班(JSON的方法也会得到这个文件,使用JSON的方法是微软官方推荐使用的方法)

 

(5)修改参数

一般修改两个地方就可以使用了,如果你是高手请忽略。

第一个地方:/usr/bin/gcc -> /usr/bin/g++

由于我们调试的是C++程序,所以是不能直接使用gcc编译的(不是不能编译,是不能直接编译),需要调用gcc的外壳封装程序g++(gcc如果要变异C++程序需要外加很多参数,这个具体去看gcc的文档)。

第二个地方:clang-x64 -> gcc-x64

根据上面的提示完成这步

可以修改的地方:其他任何地方都可以根据需求修改,这里只说明修改C和C++的标准

  

 

(6)设置好参数后,我们回到你的源文件(本例中的helloworld.cpp)

按下Ctrl+Alt+P调用命令面板,输入task,找到下面的选项

任务:运行任务[Tasks:Run Build Task],点击

点击后,或者直接按下Shift+Ctrl+B进行编译,跳转到下面这个选项栏

根据第2步中配置好的g++,选择C/C++: g++ build active file

这步不能选错,一定要对应!

点击后,我们实际上就完成了我们的编译->链接->生成可执行文件的过程,在你的工作区中会出现一个和源码文件同名的可执行文件(本例中为helloworld)

可以在vscode中新建一个终端,来观察这个可执行文件

 

(7)再次回到我们的源码文件中,点击F5按键,或者在左侧边栏中的调试(Ctrl+Shift+D)下,在如下的位置中点击绿色的小三角

然后跳转到如下的选项框中

在选择C++(GDB/LLDB)选项之前,先设置好断点

点击后,跳转到另一个选项框

和之前一样根据配置,选择使用g++ build and debug active file

一样,不能选错,要和配置的对应好!

点了这个选项后,我们就真正开始运行和debug程序了

与此同时,我们的工作区中的.vscode文件夹中也发生了变化

会自动生成官方文档中的tasks.json和launch.json文件。

下面的调试控制台会输出调试信息,终端中会输出程序输出的结果。

至此,我们的ubuntu下的debug安装就结束了。如果你不想每次都按照这个步骤来设置,可以将.vscode文件复制到你的新的工作区中(也就是你打开的文件下),就可一直接使用了。

对于以上的操作,Ctrl+Shift+B编译链接生成的步骤可以省略,直接进行下一步就可以。

--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------

  • win10下的操作

环境准备

1、安装vscode

2、安装C++ extension for VS Code插件(在vscode的插件库里就能找到)

cpp extension

 

3、安装Microsoft C++ (MSVC) compiler toolset.

      这里有两种获取Microsoft C++ (MSVC) compiler toolset的方法

    (1)安装vs(我推荐安装vs2017,简单智能,除了需要网速还要比vs2019稳定,当然安装其他版本理论也行)

    (2)或者安装独立工具包在这链接里,Downloads page中vs的web安装工具中在单个组件中查找MSBuild下载(现在都是vs2019了)

 

4、安装Win10 SDK,这个也是可以在vs的web安装工具中,在单个组件中找到相应的win10 SDK。

 

5、设置环境变量

计算机->右键属性->高级系统设置->高级->环境变量->用户变量下做如下操作:

(1)path下添加

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64

(2)添加新环境变量LIB

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\lib\x64

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64

(3)添加新环境变量INCLUDE

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\include

C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt

C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um

这是我安装的结果环境变量是这么设置,你的安装环境什么样子相应改一下。

 

6、安装调试

(1)在开始菜单中找到一个叫Developer Command Prompt for VS 2017(或者2019)的程序,中文叫VS XXXX的开发人员命令提示符 

打开后如下图所示

我们不能直接在这个路径下操作,切换到一个可以操作的路径,比如你的用户文档目录

使用命令 cd C:\Users\[你的用户名]\Documents,回车切换

然后新建一个文件夹,你也可以在资源管理器中的对应位置建好后直接打开文件

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

code .命令直接在vscode中打开文件夹(也就是工作区)

 

(2)在该路径下新建一个名叫helloworld.cpp的文件,贴上代码

//helloworld.cpp
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
    
    return 0;
}

之后的操作就和Ubuntu下的基本一致了,与之不同的是省略中间编译的步骤和不用修改第一个.json文件的参数,直接按下F5运行就会完成编译->链接->生成的过程,代码就可以直接调试了。还有要注意的是,如果你的计算机里安装了Git或着MinGw,一定要注意不要使用C++(GDB/LLDB),要使用C++(Windows)

如果你直接使用Ctrl+Shhift+B进行编译链接生成,会报一个错误,这个问题,我没有解决,希望有大佬解决了可以教小弟一下,谢谢。

(3)在完成第一次编译调试之后,你就可以不用再每次都使用VS XXXX的开发人员命令提示符 来启动你的vscode了,因为我们已经得到了我们所需的三个关键文件c_cpp_properties.json、launch.json和tasks.json。实际上,整个编译流程都是依靠这三个文件的,我们获得着三个文件之后,就完成了调试的安装。所以,windows下,们最好是建立一次.vscode的文件结构后,直接拷贝拿来用就可以了。

 

另外,和Ubuntu下不同的是,输出的结果是在调试控制台输出的,不是在终端。

--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------

关于更多的c_cpp_properties.json、launch.json和tasks.json文件内容的设置,请参考微软的官方文档。

--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------

语文水平有限,如果有哪里有疑问,欢迎评论提问或私聊。

Enjoy it!

--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------

2019.7.29更新

以上的方法只能实现单一文件的编译和调试,如果想要#include 本地自定义的头文件,需要在tasks.json中做一定的修改,Win10和Ubuntu下都是如此

例如:

我的main所在的源码是这样的

//helloworld.cpp
#include <iostream>
#include "printVec.h"

int main()
{
    vector<int> ivec{1,2,3,4,5,6,7,8,9};
    
    printVec(ivec);

    return 0;
}

这里我定义创建了一个头文件名叫 printVec.h 和 printVec.cpp,其中的代码如下

// printVec.h
#ifndef _PRINTVEC_H_
#define _PRINTVEC_H_
#include <vector>
#include <iostream>
using namespace std;
using std::vector;

void printVec(vector<int>& ivec);

#endif

// printVec.cpp
#include "printVec.h"
void printVec(vector<int>& ivec){
    for(auto c : ivec){
        cout << c << ' '; 
    }
    cout << endl;
}

函数printVec的作用就是打印vector<int>的全部的值

如果我Ctrl+Shift+B直接编译,会报如下的错误

error LNK2019: 无法解析的外部符号 "void __cdecl printVec(class std::vector<int,class std::allocator<int> > &)" (?printVec@@YAXAEAV?$vector@HV?$allocator@H@std@@@std@@@Z),该符号在函数 main 中被引用
c:\Users\leewwe\Documents\projects\hellowirld\helloworld.exe : fatal error LNK1120: 1 个无法解析的外部命令
终端进程已终止,退出代码: 2

这段话的意思是,链接器找不到引用的printVec函数的定义,无法完成链接。

问题出在哪里呢?

打开tasks.json文件

// Win10
{
    "tasks": [
        {
            "type": "shell",
            "label": "cl.exe build active file",
            "command": "cl.exe",
            "args": [
                "/Zi",
                "/EHsc",
                "/Fe:",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "${file}""
            ]
        }
    ],
    "version": "2.0.0"
}
// Ubuntu
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "/usr/bin"
            },
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]
}

注意那个 "args" 的参数,这些是什么呢?实际就是我们传输给编译器的编译参数,告诉编译器什么编译等级,输入文件在哪里,输出文件在输出到哪里。

当你按下Ctrl+Shift+B

Win10下等同于 cl.exe /Zi /EHsc /Fe: helloworld.exe helloworld.cpp

Ubuntui下等同于 g++ -g helloworld.cpp -o helloworld

看到这里我想很多同学应该已经明白了,"args"参数中之传入了之前的单个文件,我们根本就没有告诉编译器还有一个文件也要编译,因此链接的时候就会出错。

需要做的修改就是在tasks.json文件中的"args"参数下添加我们要编译的文件

// Win10
"args": [
    "/Zi",
    "/EHsc",
    "/Fe:",
    "${fileDirname}\\${fileBasenameNoExtension}.exe",
    "${file}",
    "${workspaceFolder}\\printVec.cpp"
]
// Ubuntu
"args": [
    "-g",
    "${file}",
    "-o",
    "${fileDirname}/${fileBasenameNoExtension}",
    "${workspaceFolder}/printVec.cpp"
],

这个时候,你就可以使用重新编译了,理论上是可以成功的,但是我在Win10下需要重启VScode一次,在wsl和Ubuntu下重启了系统才能用。

对于多进程程序的调试,Ubuntu下需要安装根据编译提示,需要安装env

在Ubuntu18.04下

sudo apt-get install env2

参考文档:

1、https://blog.csdn.net/fise19/article/details/82142712 环境变量的设置

2、https://code.visualstudio.com/docs/cpp/config-msvc 微软官方文档

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Visual Studio Code是一个功能强大的代码编辑器,也可用于C语言的开发。以下是使用Visual Studio Code搭建C语言开发环境的步骤: 1. 首先,在Ubuntu上安装Visual Studio Code。你可以在Ubuntu Software中搜索并安装,或者前往Visual Studio官网下载并安装Visual Studio Code。 2. 安装完成后,打开Visual Studio Code。 3. 为了方便中文输入,你可以安装中文语言包。在Visual Studio Code的左侧导航栏中,点击"Extensions"按钮,在搜索框中输入"chinese",然后安装"Chinese (Simplified) Language Pack for Visual Studio Code"。 4. 接下来,你需要配置C语言的开发环境。在Visual Studio Code中,点击菜单栏的"View",然后选择"Terminal",这将打开一个终端窗口。 5. 在终端窗口中,你可以使用以下命令安装C语言的编译器和调试器: ``` sudo apt-get update sudo apt-get install build-essential ``` 6. 安装完成后,你可以创建一个C语言项目。在Visual Studio Code的左侧导航栏中,点击"Explorer"按钮,然后点击右上角的"New Folder"图标创建一个新文件夹,并给它命名为你的项目名称。 7. 在新创建的文件夹中,点击右上角的"New File"图标创建一个新文件,然后将其命名为你的C源文件的名称(例如main.c)。 8. 编写你的C代码。在新创建的C源文件中,输入你的C代码。 9. 要编译和运行你的C代码,可以使用终端窗口。在终端窗口中,使用以下命令进行编译和运行: ``` gcc -o output_file_name input_file_name.c ./output_file_name ``` 10. 如果你需要调试你的C代码,可以使用Visual Studio Code调试功能。在Visual Studio Code的左侧导航栏中,点击"Run and Debug"按钮,然后点击右上角的"Create a launch.json file"链接。根据提示,选择适合你的C语言调试器,并进行配置。 以上就是使用Visual Studio Code搭建C语言开发环境的步骤。祝你编写代码顺利!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值