一. 前言

1.1 写在前面

每个人都有自己的开发方式,用久了、习惯了、满足现有的开发任务也就够了。

很多情况下适应新的工具多少会有一些学习成本。

本文只是推荐一些小工具,感兴趣可以尝试一下,用与不用,自己喜欢就好:smile:。

vscode海量插件,我也只用到冰山一角,如果有好用的插件,欢迎分享。

1.2 主要内容

本文介绍我在日常开发过程中,有助于提高开发效率的插件,并简单描述一下他们的使用方法。

主要针对的开发语言是c,很多插件也只是会用一些比较基本的功能,如果大家感兴趣,可以再研究研究,或许会有新发现,并欢迎分享。

1.3 使用环境

我是在linux环境下使用的vscode,并且可以访网络,比较方便配置编译和运行环境,也方便下载插件。

1.4 插件安装

点此进入官网

vscode左侧栏目中可以找到插件图标,可以看到或配置自己安装的所有插件。

联网环境下可以在vscode插件管理中直接搜索并安装插件。

如果没有联网,可以进入https://marketplace.visualstudio.com/VSCode下载插件,并导入vscode。网上文档很多,这里不做介绍。

二.插件推荐

2.1 c代码分析

sourceinsight不同,没有任何插件的vscode可以理解为一个notepad,并不具备分析代码、结构体、函数调用等功能。

1. C/C++

常用的同步代码插件为C/C++:

这个没啥说的,安装后会定期自动同步代码。

2. clangd

Clangd是一个语言服务器,真正分析代码的是通过clang项目来完成的。

该项目旨在提供一个更高效的、占用内存更低的代码分析工具。

clangd插件的代码同步是基于编译时的文件进行的。它会分析编译过程中涉及到的.c.h,与之相反C/C++会分析项目中的所有文件。

由于该插件只分析编译过程中的代码文件,它不仅可以减少分析数据的数量,还能最准确地定位到函数定义的位置。例如在编译内核项目时,如果我们指定编译目标为arm64,在跳转涉及到架构的代码时,会准确地跳转到arm64的定义中,不会被同项目中的x86架构影响。

在linux代码规模下,clangd已经很明显比C/C++分析的要快,跳转的要准了。

安装clang和clangd的方法可以参考官网https://clangd.llvm.org/

但是clangd也有一个”致命”的缺点,它的同步代码功能需要依赖compile_commands.json文件,这个文件貌似需要编译一遍项目才能生成。(但是linux项目中有一个gen_compile_commands.py脚本,似乎可以不用编译,就直接生成)。

1
2
zrf@debian:linux$ ls -alh compile_commands.json 
-rw-rw-r-- 1 zrf zrf 2.3M 5月21日 11:50 compile_commands.json

它的主要内容如下,就是把make过程中的源文件、目标文件、头文件记录下载,然后供clang来生成同步数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[
{
"arguments": [
"/usr/bin/gcc",
"-Wp,-MMD,ipc/.mqueue.o.d",
"-nostdinc",
"-I./arch/x86/include",
"-I./arch/x86/include/generated",
"-I./include",
"-I./arch/x86/include/uapi",
"-I./arch/x86/include/generated/uapi",
"-I./include/uapi",
"-I./include/generated/uapi",
"-include",
"./include/linux/compiler-version.h",
"-include",
"./include/linux/kconfig.h",
"-include",
"./include/linux/compiler_types.h",
"-D__KERNEL__",
"-fmacro-prefix-map=./=",
"-Werror",
"-std=gnu11",
"-fshort-wchar",
"-funsigned-char",
"-fno-common",
"-g",
"-c",
"-o",
"ipc/mqueue.o",
"ipc/mqueue.c"
],
"directory": "/home/zrf/git/linux/linux",
"file": "/home/zrf/git/linux/linux/ipc/mqueue.c",
"output": "/home/zrf/git/linux/linux/ipc/mqueue.o"
},

clang的代码分析都是通过这个compile_commands.json文件,来生成index数据库,clang通过这个数据库来实现高效的关联与跳转动作。

1
2
zrf@debian:linux$ ls .cache/clangd/
index

如果大家尝试过用vscode的C/C++来同步RCIOS4的代码时,就会发现,由于源文件太多了,C/C++基本无法完成同步工作。

但是clangd给我们提供了一种在超级庞大的项目中,只同步编译过程中文件的可能。

2.2 AI类

我没比较过这类插件,功能应该都大查不差。基本之和插件背后关联的语言模型相关。

我使用的是GitHub CopilotGitHub Copilot Chat。它默认用的是GTP-4o。

2.3 文档类

1. markdown

交付项目时用word或者PDF还是传统的方式,但是像概要设计文档这类基本只在开发人员之间传递的文档,我比较喜欢使用markdown。

markdown文档是纯文本文档,它的设计目标就是专注于内容,较少地关注格式

markdown有自己的写作语言规范。这个文档描述地很详细。90%的语法,最多5分钟,都可以完全学会。

本篇文档就是使用markdown语言来编写。

vscode有一些快速渲染markdown的工具和markdown语法检测工具,推荐给大家:

  • Markdown Preview Enhanced
  • markdownlint

由于makrdown是专注内容的文本格式,在格式方面,就比较灵活,现在已经有了很多插件,可以支持把Markdown文档转为PDF、word、静态html、eBook等。

2. excalidraw

这是一个画图插件。也可以脱离vscode运行,它有自己的网站,也可以直接画图。

手绘风格,我挺喜欢,这是一些例子:

alt text

alt text

2.4 环境搭建

Docker相关:

Container Tools

主要用来访问镜像内部的文件系统

alt text

ssh相关:

Remote-SSH

假如你的宿主机器可能会运行很多虚拟机,让项目在虚拟机中运行,可以通过这个插件直接访问虚拟机的shell,同时可以编译、运行、调试在虚拟机中的项目。

alt text

三. 拓展

本节记录一些插件的详细使用方法

3.1 C/C++

这个插件在比较常见的项目规模下(github上那些开源项目),都足够满足使用需求,linux项目算是比较大的,用C/C++来分同步代码也够用。

这个插件有一个运行和调试功能,有时候可能会帮助我们阅读代码和进行调试。

详细的调试方法参考此处

效果如下,在源文件中打断点,使用launch配置文件,通过launch模式,使用gdb拉起被调试进程:

在左上侧可以看到当前栈空间内的所有变量信息,可以查看他们当前的值。

左侧有调用栈信息,可以观察调用路径。

也可以像gdb一样单步调试,只不过vscode可以一边看代码,一边进行调试。

alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
zrf@debian:ipsec$ cat .vscode/launch.json 
{
"version": "0.2.0",
"configurations": [
{
"name": "debug",
"type": "cppdbg",
"request": "launch",
"program": "/home/zrf/git/ipsec/build/src/charon/.libs/charon",
"cwd": "${workspaceRoot}",
"environment": [],
"MIMode": "gdb",
"miDebuggerPath": "/home/zrf/git/ipsec/sudo_gdb",
"stopAtEntry": false,
}
]
}

也可以使用attach模式附加到一个已经运行着的进程。我用的不多,没有示例展示。

3.2 clangd

之前提到过,它在同步代码时,只会同步那些会被编译的代码。这是通过compile_commands.json文件完成的。

现在介绍一下这个文件主要通过这三种方式:

  • bear
  • cmake
  • python

bear是make的包装器,通常的使用方法就是bear -- make,然后就生成compile_commands.json了。
也就说如果是通过Makefile构建的工程,就一定可以自动生成compile_commands.json

如果项目是通过cmake构建的,可以在编译时指定变量cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1,cmake执行完成后,就自动生成compile_commands.json了。

linux等一些项目中,有编写好的生成compile_commands.json的python脚本,直接执行这个脚本应该也行(但我是使用bear – make生成的)

1
2
zrf@debian:linux$ ls scripts/clang-tools/gen_compile_commands.py 
scripts/clang-tools/gen_compile_commands.py

3.3 remote ssh

大多数同事都是在windows下进行办公,可以下载一个windows的vscode,然后创建一个虚拟机,通过remote ssh插件访问虚拟机中的文件。

alt text

相当于直接ssh到虚拟机中了,可以使用虚拟机中的gcc和常用的开发lib库,这样也方便代码的编译。相当于使用samba挂载到网络位置,然后使用sourceinsight来看代码,再用CRT等软件ssh到编译机来编译项目了。不同的是,vscode的插件极其丰富,可扩展的功能比sourceinsight多。

alt text