Mac系统M1使用CodeLLDB在vscode调试

自从我将系统升级到Monterey,vscode就变了,这个配置不能Debug了,心痛之余,我找到了另外的解决方案:vscode 插件 CodeLLDB。一些同学可能不知道什么是LLDB,我在这里进行了简短总结,可以看一下。

下面讲一下怎么使用CodeLLDB.

第一步,扩展程序搜索并安装CodeLLDB.
第二步,编写一个test.cpp,打上断点调试,大概率调试是不通过的,可能会安装CodeLLDB需要的package,等他装好,然后会跳出launch.json,在launch.json中加入以下代码:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "clang++ - 生成和调试活动文件",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ 生成活动文件"
        }
    ]
}

以上文件中这几个选项比较重要:

  1. type —— 必须设置为lldb。这个参数决定了使用哪种调试器。
  2. cwd —— 必须改为${workspaceFolder}。这里将当前目录改为工作区目录,不改的话调试找不到文件。
  3. externalConsole —— 设置为true。否则无法调试有输入的文件。

第三步,保存之后重新调试,这时会发现系统自动生成了task.json。至此就可以开始调试了。
第四步,在.vscode文件夹下创建settings.json文件,设置files.exclude选项。

以上配置完成之后会发现一个问题:生成的可执行文件默认是没有后缀的,这样就无法通过files.exclude隐藏,目录里会出现很多可执行文件。

解决办法:
想要解决,就要搞清可执行文件是在哪里产生的,以及在哪里使用的。在编译之后会产生可执行文件,在链接阶段要使用到可执行文件。在我们的配置中:

有两个地方进行编译:
第一,运行前会编译。可通过在setttings.json文件夹设置code-runner.excutorMap选项解决;
第二,调试前会编译。可通过在task.json中设置任务执行方式进行改变。

有一个地方会使用:在我们启动调试后的链接。可通过在lanuch.json中设置链接文件格式解决,如果不做设置,在链接文件的时候会出现找不到文件的情况。

设置之后的三个文件如下,可以直接复制粘贴:
settings.json

{
    "files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        "**/Thumbs.db": true,
        "**/*.dSYM":true,
        "**/*.out":true,
    },

    //code-runner settings===================================================================================================
    "code-runner.executorMap": {
        "cpp": "clang++ $dir$fileName -o $fileNameWithoutExt.out -g -std=c++17 && $dir$fileNameWithoutExt.out",     
    }
}

task.json

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

lanuch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "clang++ - 生成和调试活动文件",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ 生成活动文件"
        }
    ]
}

详细说来,其实相比于最初的配置文件,更改的只有三个地方:
1.settings.json中增加以下代码,使得在运行的时候使用clang++、c++11并产生有.out的可执行文件,同时执行可执行文件。

//code-runner settings==========================
    "code-runner.executorMap": {
        "cpp": "clang++ $dir$fileName -o $fileNameWithoutExt.out -g -std=c++17 && $dir$fileNameWithoutExt.out",     
    }

其中-o参数是为了为可执行文件命名,-g参数是避免编译器优化,为了方便调试。

2.tasks.json中修改以下选项,在最后加上.out,这样产生的可执行文件就会带.out后缀。

tasks -> args -> "${fileDirname}/${fileBasenameNoExtension}.out"

3.launch.json中修改以下选项,在最后加上.out,这样链接的时候就回去找带.out后缀的可执行文件。

configurations -> program -> "${fileDirname}/${fileBasenameNoExtension}.out"

你可能感兴趣的:(环境配置,vscode,c++,编译器)