基于C++的HTTP WebServer实现 -- Sourcetrail使用说明(CPP项目)
本文介绍了如何使用Sourcetrail工具分析C++项目代码结构。Sourcetrail是一款跨平台源代码可视化工具,通过解析编译数据库生成交互式关系图,帮助开发者理解大型项目结构。文章详细说明了安装过程、创建项目步骤(包括生成compile_commands.json文件)、以及如何使用搜索框、CustomTrail等功能来查看类图、函数调用关系等。特别针对C++项目可能遇到的编译问题提供了解
本系列主要记录自己在学习过程的思路、问题、解决方法。最后实现一个高性能的HTTP 服务器,用于学习cpp、网络编程、服务器相关的内容。
系列目录
本文主要介绍如何使用 Sourcetrail 对 C++ 代码进行可视化分析。通过生成compile_commands.json
并借助 Sourcetrail 的类图与调用链功能,能够快速理解项目结构,定位类之间的关系和函数调用逻辑,并在此过程中总结了常见问题及解决方法。
本文目录
一、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:
终点符号(可选,比如你想看MyServer
到MyChannel
的依赖路径)。 -
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++ 项目的人来说,它是一个非常高效的工具。
更多推荐
所有评论(0)