现在有一份 4MB 的代码,共两百多个代码文件。
想要了解它的逻辑,但是不知道怎么下手。
1
angryfish 2023-04-10 08:31:03 +08:00
开源代码就网上找找源码资料。
内部代码就先跑跑,看看功能。问问同事,了解大概后看看 main ,找一个模块看看先。 |
2
quejuwen 2023-04-10 08:36:02 +08:00 via Android
了解逻辑的目的?
|
3
zomco 2023-04-10 08:44:59 +08:00
给 GPT 试试?
|
4
Yeen 2023-04-10 08:59:56 +08:00
首先,不同项目类型分析方法千差万别。比如客户端产品与后台服务器代码。以客户端产品举例。
0 判断项目类型,分析工程目录文件结构,关键配置,依赖第三方库等,了解全局。 1 先找入口点。 2 根据文件引用和调用点顺藤摸瓜,画出类图(或者函数、API 、模块关系图)。 3 找到关键的功能点( feature ),一边运行调试一边分析调用关系。 |
5
litguy 2023-04-10 09:10:15 +08:00
从 main 函数入口看
|
6
B9hkc 2023-04-10 09:13:29 +08:00
ChatGPT
|
7
MozzieW 2023-04-10 09:24:22 +08:00
1. 先跑起来
2. 确定自己要做什么(漫无目的 or 要修改某个逻辑) 3. 找的入口函数,看代码有哪些模块,结构是怎么组合起来的,找的自己敢兴趣的部分 4. 各种方法结合,搜索、跳转、笔记、调用关系 5. 最重要的,强调一遍:知道自己要做什么。不要想着从头看到尾,不要想弄清每一个细节。 6. 搜索 项目+代码解析,文章的思路就是看代码思路。 |
8
foxkiller 2023-04-10 09:25:53 +08:00
先拿 Understand 跑一下看一下,根据需求顺着调用入口一条链往下看。
|
9
ufo5260987423 2023-04-10 09:42:31 +08:00 1
根据你的目的不同,一般要:
1 、找入口和出口,比如 io 是从哪儿进入哪儿输出的,比如 main 函数在哪儿开始在哪儿结束;顺便,关于 io 我见过很多代码把函数的副作用甩籽一样满世界散,然后都作为输出的,笑; 2 、很多和学术有关的项目,函数名往往和学术名词关联,维基百科一下或者看一下论文; 3 、分析依赖包都是干什么用的,同类竞品都有什么——有时候用这个包不用那个,是因为一些特性需要用; 4 、按照入口、出口的逻辑,绝大多数大项目都类似 MVC 结构把代码分成 model view controller 三个层次,然后在 controller 这儿再按照业务来分。 |
11
artnowben 2023-04-10 10:12:53 +08:00
先熟悉功能,然后调试代码,可以 gdb ,可以打印,先熟悉一个功能;然后再熟悉其他的
|
12
yangxin0 2023-04-10 10:14:40 +08:00
1 、弄清楚这个源码是啥功能
2 、阅读公开的文档,如果设计到一些论文也建议阅读 3 、你要针对这份源码干什么,带着目的去读源码(如果仅仅为了读而读面对大规模封装是很难读下去的) 4 、(这才是读的步骤) main 是一个很好的入口, 使用调试器打断点也是不错的辅助工具,真正浏览代码 vscode 就足够 |
13
unlighted 2023-04-10 10:42:20 +08:00 via iPhone 1
1.如果是库,那就看 exanple ,跟着案例一个一个模块看
2.如果是应用,那就从 main 开始 另外可以借助 doxygen 生成类关系图辅助下 |
14
Devilker 2023-04-10 10:48:48 +08:00
分析一个陌生的大型 C++项目是一个挑战,但也有一些方法可以帮助你。根据网上的一些建议 1 2 3 ,你可以:
从 main() 函数开始,跟踪程序的执行流程,了解项目的主要功能和模块。 使用一些工具,如 Doxygen 、Visual Studio 、Eclipse 等,来生成项目的文档、类图、调用图等,方便你查看代码的结构和依赖关系。 阅读项目的文档、注释、测试用例等,获取更多的信息和细节。 选择一个感兴趣的模块或功能,深入研究其实现原理和细节,尝试修改或优化代码,并运行测试。 与项目的开发者或用户交流,询问他们对项目的理解和建议,学习他们的经验和技巧。 |
15
jones2000 2023-04-10 10:57:13 +08:00
1.编译跑起来
2. 需要哪个功能, 查客户端的 UI ,找到这个 UI 对应的事件函数,断点,然后 f10, f11 跟进去,把调试用到的代码都拷出来,基本就可以能扣出来了。 |
17
foxkiller 2023-04-10 17:29:12 +08:00
|
18
bfjm 2023-04-10 20:42:20 +08:00
mark c++静态代码分析工具
|
19
James369 2023-04-10 21:43:51 +08:00
一直设想的东西,把一陀代码扔给 AI 阅读,AI 吐出来一张网状图谱
|
20
victorc 2023-04-10 22:14:50 +08:00
用 source insight 啊
|
25
bfdh 2023-04-13 14:51:49 +08:00 1
@jdz #24
``` #!/bin/bash set -e #download v6.3.1136 for Linux 64bit from offical website, and then execute this script. EXEFILE=$1 [ ! -x "$EXEFILE" ] && { echo "usage: $0 /path/to/the/main/program/excutable/file" exit 1 } function sed_script(){ cat <<- EOF | base64 -d | gzip -c -d H4sIAAAAAAAAA62VuW4bMRCG+zzFNO4CivdhIMV2Tm07QODYwZ6RgHgVRCqct88Mj5W0keQIEEFQ JAV+/Ocfkqu9MoK3wLmzvDH8FrQAY0EJGGzsm9hq6hgFpgHTxZk2th1A9UWw6rF6eLx/eq6+Vc8f NDFFYdrM7KFVEPhB7T3UyAxQd8AFaA++gaZB5gvL5Stjd4wR02qbmEJ1yBxa0oM6uyYuFNDj3544 nFOlyQ6sgc5D4wHYvSAUlTvWF6YrzB6Z01qsGOl+mCkEagcapliAYE8UdPVSfX9GptTKOEtCpZF1 NNQFUB1IA0oR1/l5lf3BEP58ulHsLZb4k6GuQMnR2XqrwA5guyhcg/VgAzgFkgNqwT5EWrt+ZQ/L 1QZ+rhCqpeQ6QrXqGoRaARZZOi5LxDgkVmzTjItxYAfqEZ1Yj91qu1qPGzZmqCnQlqCJkloVpQnC UYawI8tk2sMArMf12C7rLat+t8vVtkeo8UqoCPWy9ZSoYz6eMpQ8zX4WS98yVBdo2Pd0Zii25EyR SXEYkEP0NFr6WqPQsV8QNASTsu+DUgTFJLRkqA7ZAaSfkQ+bj/B5bNkkGKFW6Rx+sI0mTz2ZRZXT BqomOVhPQpfb7a/N7WJxCJUTtL8WVDuTPA3NIGbn9Ex+dtCDLE1QywvUXUupsSolKgxWzaDvEgt0 j1mgrkD1mfCn4zXbYwofj9UiQx0XLt2oRoh5os4rTUbPlLICtQU6/KdSesNE3uxA6Y1YJKiRGSpd l6Bncv2vD7DLe3IAoUFwTx8TaXm6+xdd/D2l06HKUFmgu7t/NDOnoFOOdlARP6UE7enlt+7C8H8c C18IU6D10fDP7wGzC8Uy1BdodzVPhQgF2l/qKT6Jc0+zUlmyP/CrHKm/3xQSiPMIAAA= EOF } SCRIPT=$(mktemp) TMPFILE=$(mktemp) echo patching... xxd -g1 "$EXEFILE" > "$TMPFILE" sed_script > "$SCRIPT" sed -i -f "$SCRIPT" "$TMPFILE" xxd -r -g1 "$TMPFILE" "$EXEFILE" rm -f "$TMPFILE" "$SCRIPT" echo done ``` |