• 请不要在回答技术问题时复制粘贴 AI 生成的内容
r6cb
V2EX  ›  程序员

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

  •  
  •   r6cb · Apr 10, 2023 · 5630 views
    This topic created in 1154 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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