V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mikicomo
V2EX  ›  问与答

关于阅读大型复杂工程的源码问题

  •  2
     
  •   mikicomo · 2019-01-10 23:29:22 +08:00 · 1732 次点击
    这是一个创建于 2162 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 Spring 的源码,遇到了一些问题,由于类的继承,实现关系十分复杂,有时候,一个方法的实现有好几种,此时我如何有效的判定代码真正进入的实现方法呢? 我现在是用的笨办法,每个实现方法里都打上断点,看停在哪个方法上,不知道前辈们是怎么解决这类问题的

    9 条回复    2019-01-14 15:00:35 +08:00
    coderluan
        1
    coderluan  
       2019-01-11 00:26:28 +08:00   ❤️ 1
    c++的话,intel 有个很好用的工具叫 vtune,运行一遍就能分析整个调用流程,我现在基本都是用这个。
    secondwtq
        2
    secondwtq  
       2019-01-11 01:23:21 +08:00
    Java 还好,我这 C++ 的打断点,gdb 先载入一分钟的 symbol ...
    TomVista
        3
    TomVista  
       2019-01-11 07:58:37 +08:00
    画类图,流程图.数据流转图.
    ian19znj
        4
    ian19znj  
       2019-01-11 08:01:09 +08:00
    Java 不清楚,我做的是 C#,一般我们的编码规范是父类的方法设为 virtual foo(),子类 override 该方法时,首先必须调用 base.foo(), 再写子类的逻辑。所以将断点设在 base.foo()上,就能从 call stack 上看到是由哪个子类调用的了。
    iluhcm
        5
    iluhcm  
       2019-01-11 08:26:16 +08:00 via iPhone   ❤️ 1
    你在断点某个类的时候,这个类的所有成员接口变量的实现就已经确定了,只需要按住 opt 并点击这个接口,就可以知道是哪个实现类了。然后可以通过快捷键快速跳转到实现类。
    mikicomo
        6
    mikicomo  
    OP
       2019-01-11 10:08:45 +08:00
    @iluhcm #5 我试试看
    mikicomo
        7
    mikicomo  
    OP
       2019-01-11 14:16:38 +08:00
    @iluhcm #5 试了下,当该类是抽象类并且同时又实现继承了别的类的时候,在抽象方法调用出打断点,按照你的方法,opt 点击这个接口,显示 undefined,好像并没有作用吧?
    iluhcm
        8
    iluhcm  
       2019-01-12 21:35:23 +08:00 via iPhone
    @mikicomo 怎么可能 undefined,接口在运行时的实现都是已经确定下来了的,除非通过动态代理生成。
    mikicomo
        9
    mikicomo  
    OP
       2019-01-14 15:00:35 +08:00
    @iluhcm #8 可能我姿势不对吧...抽象类调用自己的抽象方法,按照你的方法在我这里不行..
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:07 · PVG 07:07 · LAX 15:07 · JFK 18:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.