V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
r6cb
V2EX  ›  程序员

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

  •  
  •   r6cb · 2023-04-10 08:08:46 +08:00 · 4668 次点击
    这是一个创建于 593 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    从 main() 函数开始,跟踪程序的执行流程,了解项目的主要功能和模块。
    使用一些工具,如 Doxygen 、Visual Studio 、Eclipse 等,来生成项目的文档、类图、调用图等,方便你查看代码的结构和依赖关系。
    阅读项目的文档、注释、测试用例等,获取更多的信息和细节。
    选择一个感兴趣的模块或功能,深入研究其实现原理和细节,尝试修改或优化代码,并运行测试。
    与项目的开发者或用户交流,询问他们对项目的理解和建议,学习他们的经验和技巧。
    jones2000
        15
    jones2000  
       2023-04-10 10:57:13 +08:00
    1.编译跑起来
    2. 需要哪个功能, 查客户端的 UI ,找到这个 UI 对应的事件函数,断点,然后 f10, f11 跟进去,把调试用到的代码都拷出来,基本就可以能扣出来了。
    japeth
        16
    japeth  
       2023-04-10 16:53:58 +08:00
    @foxkiller upderstand 是啥工具 可以贴一下链接吗?
    foxkiller
        17
    foxkiller  
       2023-04-10 17:29:12 +08:00
    bfjm
        18
    bfjm  
       2023-04-10 20:42:20 +08:00
    mark c++静态代码分析工具
    James369
        19
    James369  
       2023-04-10 21:43:51 +08:00
    一直设想的东西,把一陀代码扔给 AI 阅读,AI 吐出来一张网状图谱
    victorc
        20
    victorc  
       2023-04-10 22:14:50 +08:00
    用 source insight 啊
    bfdh
        21
    bfdh  
       2023-04-11 15:02:57 +08:00
    @jdz #10 用和谐版(罪过,罪过。)😂
    jdz
        22
    jdz  
       2023-04-11 21:32:28 +08:00
    @bfdh linux 还是 mac 啊
    bfdh
        23
    bfdh  
       2023-04-12 09:50:22 +08:00   ❤️ 1
    @jdz #22 linux
    jdz
        24
    jdz  
       2023-04-12 17:09:09 +08:00
    @bfdh 求软件包..有偿也可 O(∩_∩)O
    bfdh
        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
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1555 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:13 · PVG 01:13 · LAX 09:13 · JFK 12:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.