win10下vscode链接wsl2

win10下vscode链接wsl2

其实之前一直对vscode有很不好的印象:比如编译正常但标红、json配置文件嘎嘎多难以上手;但是这一回被朋友推荐用它,拎出一个中午专门搞了下,感觉它的代码是真的好看……

一些版本信息:

win10 + wsl2:Ubuntu22.04

一、安装vscode

要在本机(也就是win10)中下载哟

从官网下载后,在安装时要注意勾选上添加到Path,这样能避免后续的配置出错

二、部署win10中的c/c++环境

其实可以不配置这里,直接连接wsl—>请在安装remote wsl插件后直接跳到三)标题

也就是下载插件(经典的插件要装吧),总之用到啥就装啥吧

image-20220925122437403

用于远程连接的插件三件套(其实我们链接wsl的时候只需要用remote wsl就行)

image-20220925122452694

2.1.如果你想在win10中使用g++/gdb

可以参考官网的教程,也可以按照这个视频中的来,总之原理都是在win10中自己下载gcc、g++、gdb三件套,然后把它们的路径添加到系统的环境变量中让vscode可以查找到它们、从而实现在win10中进行编译和调试

这一步只是把环境配置好,如果想要调试还需在vscode中进行json文件的配置;vscode会在每一个项目文件夹中生成launch、task两个json文件(或者再包括c_cpp_properties.json),它们将会说明这个项目中用到的是哪里的gdb(需要你配置路径)、需要使用的接口等

三、在wsl2中进行设置

3.1.检查环境

划重点:要检查你的g++和gdb存在且可用!

存在且可用是指:

  1. 存在:执行whereis g++whereis gdb后,有回显说明其路径

    image-20220925124300047

  2. 可用:随便写一个test.cpp,能正常使用g++编译成功后,使用gdb编译可执行文件时能击中断点(这里应该是一个wsl的bug,接下来我会提到)

    // test.cpp
    #include <iostream>
    int main(){
    	std::cout << "hello world!" << std::endl;
    	return 0;
    }
    

    执行g++ test.cpp -o test -g无回显说明编译正常,用./test执行一下,应该有输出hello world!

    执行gdb test,进入gdb调试

    image-20220925125320058

    先用run跑一下,再b main(于main入口下个断点),后执行start开始调试,注意是否能击中断点

    image-20220925125546743

如果你执行上述功能均无误后,恭喜你~可以直接跳过下面的叙述

好,如果你发现你的执行不能击中断点,出现了这样的报错:Cannot insert breakpoint 1. Cannot access memory at address 0x8001140

那就先解决这个报错把,不然后面的vscode也无法使用坏的gdb进行调试(当你远程到wsl上时,使用的就是wsl中的gdb);我在查的时候发现这是wsl本身的bug,可以参考这里的issue

我通过打补丁的方式解决了它:简单的在wsl2中执行echo -ne '\x90\x90' | sudo dd of=/usr/bin/gdb seek=$((0x335bad)) bs=1 count=2 conv=notrunc

3.2.创建工作目录

在你的项目文件夹里,执行code .;如果运行正常,会直接自动打开vscode且远程连接wsl(在vscode左下角会显示当前的连接)

image-20220925132826093

如果没成功,可能是wsl2的设置未完全,在cmd中执行wsl.exe --set-version Ubuntu-22.04 2

这里的解决请参考:

https://www.cnblogs.com/ls11736/p/16204527.html

https://blog.csdn.net/weixin_49977305/article/details/124893021

四、vscode中json的配置

4.1.c_cpp_properties.json

使用快捷键ctrl+shift+p进行搜索(点查看->命令面板也是一样的),敲c/c++ edit configurations,选择UI版本(简单直观)

image-20220925133306121

这里的编译器路径就写你在wsl里使用whereis g++得到的路径

image-20220925133703663

4.2.launch.json

{
    "configurations": [
        {
            "name": "C/C++: g++ 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ 生成活动文件",	// 这里的名字要和task文件中的“label”值相同
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ],
    "version": "2.0.0"
}

4.3.tasks.json

{
    "version": "2.0.0",
    "windows": {
        "options": {
            "shell": {
                "executable": "bash.exe",
                "args": [
                    "-c"
                ]
            }
        }
    },
    "tasks": [
        {
            "label": "g++ build active file",
            "type": "shell",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}"
            ],
            "group": "build"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: g++ 生成活动文件",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ]
}

好了,现在请开始愉快的coding吧~

五、一个报错一个下午

ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". Warning: Cannot insert breakpoint 1.

检查wsl中的gdb能否正常工作和vscode中的配置文件,也可能与gdb版本有关

posted @   比萨在哭  阅读(2227)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示