首先安装必要插件,
- 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打开命令面板,键入如下命令:
打开本地ssh_config文件,编辑连接信息:
之后就可以在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文件,
状态栏中的clangd有输出,表示配置成功。至此可以在vscode中享受clangd带来的intelligence功能,
调试
安装好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",
}
]
}
这样,即可在本地调试程序,
远程调试
此外,lldb还支持远程调试,将lldb-server及相关文件拷贝到目标机器:
在远程机器上执行lldb-server起监听,然后在本机配置远程调试任务(上述launch.json中的第二个就是用于远程调试)。然后,当你执行这个调试任务,其实就是将可执行文件拷贝到远程机器上执行,并启用调试功能。
此外远程调试还有一个bonus,可以root权限进行调试!只需使用root权限执行lldb-server即可。
参考:
- https://github.com/vadimcn/codelldb/discussions/779
- 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.
可以看到socket创建成功了,且服务后台也有debug connect/disconnect的消息。