大家都是怎么分析一个陌生的大型 C++项目的

2023-04-10 08:08:46 +08:00
 r6cb

现在有一份 4MB 的代码,共两百多个代码文件。

想要了解它的逻辑,但是不知道怎么下手。

4269 次点击
所在节点    程序员
25 条回复
angryfish
2023-04-10 08:31:03 +08:00
开源代码就网上找找源码资料。
内部代码就先跑跑,看看功能。问问同事,了解大概后看看 main ,找一个模块看看先。
quejuwen
2023-04-10 08:36:02 +08:00
了解逻辑的目的?
zomco
2023-04-10 08:44:59 +08:00
给 GPT 试试?
Yeen
2023-04-10 08:59:56 +08:00
首先,不同项目类型分析方法千差万别。比如客户端产品与后台服务器代码。以客户端产品举例。
0 判断项目类型,分析工程目录文件结构,关键配置,依赖第三方库等,了解全局。
1 先找入口点。
2 根据文件引用和调用点顺藤摸瓜,画出类图(或者函数、API 、模块关系图)。
3 找到关键的功能点( feature ),一边运行调试一边分析调用关系。
litguy
2023-04-10 09:10:15 +08:00
从 main 函数入口看
B9hkc
2023-04-10 09:13:29 +08:00
ChatGPT
MozzieW
2023-04-10 09:24:22 +08:00
1. 先跑起来
2. 确定自己要做什么(漫无目的 or 要修改某个逻辑)
3. 找的入口函数,看代码有哪些模块,结构是怎么组合起来的,找的自己敢兴趣的部分
4. 各种方法结合,搜索、跳转、笔记、调用关系
5. 最重要的,强调一遍:知道自己要做什么。不要想着从头看到尾,不要想弄清每一个细节。
6. 搜索 项目+代码解析,文章的思路就是看代码思路。
foxkiller
2023-04-10 09:25:53 +08:00
先拿 Understand 跑一下看一下,根据需求顺着调用入口一条链往下看。
ufo5260987423
2023-04-10 09:42:31 +08:00
根据你的目的不同,一般要:

1 、找入口和出口,比如 io 是从哪儿进入哪儿输出的,比如 main 函数在哪儿开始在哪儿结束;顺便,关于 io 我见过很多代码把函数的副作用甩籽一样满世界散,然后都作为输出的,笑;

2 、很多和学术有关的项目,函数名往往和学术名词关联,维基百科一下或者看一下论文;

3 、分析依赖包都是干什么用的,同类竞品都有什么——有时候用这个包不用那个,是因为一些特性需要用;

4 、按照入口、出口的逻辑,绝大多数大项目都类似 MVC 结构把代码分成 model view controller 三个层次,然后在 controller 这儿再按照业务来分。
jdz
2023-04-10 09:57:55 +08:00
@foxkiller understand 可太贵了
artnowben
2023-04-10 10:12:53 +08:00
先熟悉功能,然后调试代码,可以 gdb ,可以打印,先熟悉一个功能;然后再熟悉其他的
yangxin0
2023-04-10 10:14:40 +08:00
1 、弄清楚这个源码是啥功能
2 、阅读公开的文档,如果设计到一些论文也建议阅读
3 、你要针对这份源码干什么,带着目的去读源码(如果仅仅为了读而读面对大规模封装是很难读下去的)
4 、(这才是读的步骤) main 是一个很好的入口, 使用调试器打断点也是不错的辅助工具,真正浏览代码 vscode 就足够
unlighted
2023-04-10 10:42:20 +08:00
1.如果是库,那就看 exanple ,跟着案例一个一个模块看
2.如果是应用,那就从 main 开始
另外可以借助 doxygen 生成类关系图辅助下
Devilker
2023-04-10 10:48:48 +08:00
分析一个陌生的大型 C++项目是一个挑战,但也有一些方法可以帮助你。根据网上的一些建议 1 2 3 ,你可以:

从 main() 函数开始,跟踪程序的执行流程,了解项目的主要功能和模块。
使用一些工具,如 Doxygen 、Visual Studio 、Eclipse 等,来生成项目的文档、类图、调用图等,方便你查看代码的结构和依赖关系。
阅读项目的文档、注释、测试用例等,获取更多的信息和细节。
选择一个感兴趣的模块或功能,深入研究其实现原理和细节,尝试修改或优化代码,并运行测试。
与项目的开发者或用户交流,询问他们对项目的理解和建议,学习他们的经验和技巧。
jones2000
2023-04-10 10:57:13 +08:00
1.编译跑起来
2. 需要哪个功能, 查客户端的 UI ,找到这个 UI 对应的事件函数,断点,然后 f10, f11 跟进去,把调试用到的代码都拷出来,基本就可以能扣出来了。
japeth
2023-04-10 16:53:58 +08:00
@foxkiller upderstand 是啥工具 可以贴一下链接吗?
foxkiller
2023-04-10 17:29:12 +08:00
bfjm
2023-04-10 20:42:20 +08:00
mark c++静态代码分析工具
James369
2023-04-10 21:43:51 +08:00
一直设想的东西,把一陀代码扔给 AI 阅读,AI 吐出来一张网状图谱
victorc
2023-04-10 22:14:50 +08:00
用 source insight 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/931104

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX