本系列主要记录自己在学习过程的思路、问题、解决方法。最后实现一个高性能的HTTP 服务器,用于学习cpp、网络编程、服务器相关的内容。


系列目录

  1. HTTPServer-动态缓冲区
  2. HTTPServer-Connection类逻辑优化
  3. git相关问题与解决方法
本文主要介绍如何使用 Sourcetrail 对 C++ 代码进行可视化分析。通过生成 compile_commands.json 并借助 Sourcetrail 的类图与调用链功能,能够快速理解项目结构,定位类之间的关系和函数调用逻辑,并在此过程中总结了常见问题及解决方法。

本文目录

一、Sourcetrail是什么

二、创建项目过程

1. 安装

2. 创建一个项目

3.生成compile_commands.json

注意:

4.项目编译信息

三、使用过程

1. 搜索框

2. 中间部分

3. custom trail

路径设置:

Node类型:

Edge类型:

4. 类间关系图

5. 函数调用图

6. 更多类型

四、总结

一、Sourcetrail是什么

Sourcetrail 是一款跨平台的 源代码可视化与探索工具,它通过解析项目的编译数据库(compile_commands.json)或手动配置编译选项,将 C、C++、Java、Python 等语言的代码索引成数据库。与传统 IDE 不同,Sourcetrail 的核心优势在于 交互式关系图:开发者可以搜索类、函数、变量等符号,直观查看它们的定义、引用、继承与调用关系,并在图形化界面中逐层展开,快速理解大型项目的结构。此外,它提供 Custom Trail(自定义轨迹) 功能,可以根据用户选择的节点类型和关系边,一次性生成定制化的依赖图,帮助分析类之间的依赖和模块耦合度。

二、创建项目过程

1. 安装

我是在window上使用的,直接去github官方项目下载即可。下载后正常安装。

2. 创建一个项目

首先在New Project输入项目的名称和地址(是sourcetrail创建的分析文件的保存路径而不是目标cpp项目的地址)

点击下方的Add Source Group进入编译数据库的选择,cpp项目默认选第一个即可,然后next:

3.生成compile_commands.json

compile_commands.json 就像一个项目编译说明书,告诉工具“每个 .cpp 文件是怎么编译的”。
有了它,工具就能像编译器一样理解代码结构,从而做 代码补全 / 类图 / 静态检查。

可以在终端中使用以下命令来生成这个文件:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
cmake -G "Ninja" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..   #window下指定编译器

注意:

如果在window环境下使用第一条命令,可能会生成一大堆无关文件而没有compile_commands.json,这时候一般是因为window下默认使用的编译器可能是visual自带的,这时候需要改用第二条命令。有可能会报错:

# CMake Error: Error: generator : Ninja Does not match the generator used previously: Visual Studio 16 2019 Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.

这时候需要清空build下所有之前生成的文件,再次运行命令即可。    

4.项目编译信息

C++ 项目通常有复杂的 include 路径和宏定义而Sourcetrail 支持直接读取compile_commands.json(CMake 可自动生成),第二部分直接找到上一步生成的文件即可。会自动找到cpp源文件,可以看到图中自动找到了11个cpp文件。

但是有可能有些文件只有.h而没有cpp文件,这时候需要我们手动添加,在headerfile中找到我们的头文件目录添加即可。

最下面的是排除在外的头文件,用来加入你不想分析的头文件或者一些平台独有、跨平台会报错的头文件。

最后点击保存即可自动生成分析文件。如果更新了代码但是没有更新编译关系,点击刷新可以更新源代码。

三、使用过程

1. 搜索框

最上面的是搜索框,可以用来找到某个类或者属性

2. 中间部分

单击每个类旁边的数字可以展开具体情况查看,双击可以切换焦点到目标类

3. custom trail

点击左侧栏第一个按钮即可进入到该页面。

“Custom Trail” (自定义轨迹)对话框,它的作用就是帮你一次性生成一张关系图,而不是手动一个个点展开。下面逐项说明一下功能:

路径设置:

  • From:
    起点符号(这里是 MyServer),表示从哪个类/函数/变量开始探索。

  • To:
    终点符号(可选,比如你想看 MyServerMyChannel 的依赖路径)。

  • All Referenced
    显示起点符号“引用到”的所有东西(被它用到的类/函数等)。

  • All Referencing
    显示“引用起点符号”的所有东西(谁在用它)

Node类型:

class 

field 类成员变量 built-in type 内建类型
struct 结构体  global variable 全局变量 non-indexed 未被索引到的符号
function 普通函数 file 文件
method 类成员函数 macro

Edge类型:

type use

使用了某个类 include 文件包含关系
use 一般性使用 macro use 宏使用
call 调用关系 member 类与成员之间的关系

4. 类间关系图

画出 “类A 有一个成员字段 → 这个字段的类型是类B”的效果(类图),如图所示

以下是配置信息,注意如果是私有成员变量是传入的指针则为private field类型,如果是调用了构造函数则为function类型:

5. 函数调用图

展现出各个method之间的调用关系,如果有lamda回调函数之类的也能正确显示:

6. 更多类型

        如果之后需要使用其他的类型也会更新。

四、总结

在本次实践中,通过 Sourcetrail 对代码进行了结构化分析,其最大优势在于它能够借助 compile_commands.json 构建出 各类调用关系,让复杂的 C++ 项目结构一目了然:

  • 借助 搜索框 可以快速定位符号;

  • 通过 Custom Trail 可以一次性生成依赖图,展现类之间的成员关系和调用链;

  • 利用 类间关系图与函数调用图,能够清晰地看到模块之间的交互方式;

  • 配合 重新索引 功能,可以在源代码更新后保持分析结果的实时性。

整体来说,Sourcetrail 更适合代码阅读和架构理解,而不是编写代码。对于需要快速熟悉大型 C++ 项目的人来说,它是一个非常高效的工具。

基于开源项目《30daysCppWebServer》进行学习、实现、优化

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐