首先安装必要插件,

  • ms-vscode-remote.remote-ssh:远程开发必备插件,可以使用ssh连接打开远端目录作为workspace
  • llvm-vs-code-extensions.vscode-clangd:提供c++ code intelligence功能,安装完此插件后,需要禁用或移除微软本身提供的c++插件(如已安装)
  • vadimcn.vscode-lldb:提供调试功能

如遇网络问题,可从vsixhub手动下载安装插件。

列一下我的插件列表:

本地:

$ code --list-extensions
huizhou.githd
jeff-hykin.better-cpp-syntax
mhutchie.git-graph
ms-vscode-remote.remote-ssh
ms-vscode-remote.remote-ssh-edit
ms-vscode-remote.remote-wsl
ms-vscode.remote-explorer
peaceshi.syntax-highlight
vscodevim.vim

远端:

$ code --list-extensions
Extensions installed on SSH: arm虚拟机(x.x.x.x):
huizhou.githd
llvm-vs-code-extensions.vscode-clangd
mhutchie.git-graph
twxs.cmake
vadimcn.vscode-lldb

远程开发配置

在vscode中,按下ctrl+shift+p打开命令面板,键入如下命令:

image

打开本地ssh_config文件,编辑连接信息:

image

之后就可以在vscode中,连接这台机器,打开远端目录。

TIPS:为了避免每次都输入ssh登录密码,可以配置ssh免密登录。

clangd配置

远程机器需要安装clangd软件包,如果没有,需要安装一个。如果安装不了,可以手动编译。内网llvm仓库地址:https://codehub-y.huawei.com/Performance_Abyss/LTEL2Tools/llvm-project/

然后在远程机器的vscode全局配置里面配上clangd可执行文件的路径:

// file:///home/hubingbing/.vscode-server/data/Machine/settings.json
{
    "clangd.path": "/home/hubingbing/llvm-project/build/bin/clangd",
    "clangd.arguments": [
        // 在后台自动分析文件(基于 complie_commands)
        "--background-index",
        // 标记 compelie_commands.json 文件的目录位置
        // 关于 complie_commands.json 如何生成可见我上一篇文章的末尾
        // https://zhuanlan.zhihu.com/p/84876003
        // "--compile-commands-dir=build",
        // 同时开启的任务数量
        "-j=12",
        // 告诉 clangd 用那个 clang 进行编译,路径参考 which clang++的路径
        "--query-driver=/usr/bin/g++",
        // clang-tidy 功能
        "--clang-tidy",
        "--clang-tidy-checks=performance-*,bugprone-*",
        // 全局补全(会自动补充头文件)
        "--all-scopes-completion",
        // 更详细的补全内容
        "--completion-style=detailed",
        // 补充头文件的形式
        "--header-insertion=iwyu",
        // pch 优化的位置
        "--pch-storage=disk",
    ],
}

配置完成后,打开一个cpp文件,

image

状态栏中的clangd有输出,表示配置成功。至此可以在vscode中享受clangd带来的intelligence功能,

image

调试

安装好codelldb插件后,选择一个cpp文件,按F5,vscode会自动提示你创建一个调试任务(如果之前没配过)。简单配置成下面的样子即可,

// file:///.vscode/launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    // for variables see: https://code.visualstudio.com/docs/editor/variables-reference
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "args": [],
            "cwd": "${workspaceFolder}/service/src/main/cpp",
            "program": "service/src/main/cpp/build/${fileBasenameNoExtension}",
        },
        {
            // see: https://github.com/vadimcn/codelldb/blob/master/MANUAL.md#connecting-to-lldb-server-agent
            // and https://github.com/vadimcn/codelldb/discussions/779
            "type": "lldb",
            "request": "launch",
            "name": "RemoteLaunch",
            "args": [],
            "program": "service/src/main/cpp/build/${fileBasenameNoExtension}",
            "initCommands": [
                "platform select remote-linux",
                // "platform connect connect://127.0.0.1:12306",
                "platform connect connect://10.136.193.188:12306",
            ],
            "expressions": "native",
        }
    ]
}

这样,即可在本地调试程序,

image

远程调试

此外,lldb还支持远程调试,将lldb-server及相关文件拷贝到目标机器:

image

在远程机器上执行lldb-server起监听,然后在本机配置远程调试任务(上述launch.json中的第二个就是用于远程调试)。然后,当你执行这个调试任务,其实就是将可执行文件拷贝到远程机器上执行,并启用调试功能。

此外远程调试还有一个bonus,可以root权限进行调试!只需使用root权限执行lldb-server即可。

参考:

  1. https://github.com/vadimcn/codelldb/discussions/779
  2. https://github.com/vadimcn/codelldb/blob/master/MANUAL.md#connecting-to-lldb-server-agent

例如:

int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

如果不用root权限执行,会返回errno 1, EPERM,即permission denied. 为了能够正常创建socket并debug,必须使用root身份运行debugger.

image

可以看到socket创建成功了,且服务后台也有debug connect/disconnect的消息。

image

References

  1. https://windowsmacos-vscode-c-llvm-clang-clangd-lldb.readthedocs.io/configure.html