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

2019-01-10 23:29:22 +08:00
 mikicomo

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

1658 次点击
所在节点    问与答
9 条回复
coderluan
2019-01-11 00:26:28 +08:00
c++的话,intel 有个很好用的工具叫 vtune,运行一遍就能分析整个调用流程,我现在基本都是用这个。
secondwtq
2019-01-11 01:23:21 +08:00
Java 还好,我这 C++ 的打断点,gdb 先载入一分钟的 symbol ...
TomVista
2019-01-11 07:58:37 +08:00
画类图,流程图.数据流转图.
ian19znj
2019-01-11 08:01:09 +08:00
Java 不清楚,我做的是 C#,一般我们的编码规范是父类的方法设为 virtual foo(),子类 override 该方法时,首先必须调用 base.foo(), 再写子类的逻辑。所以将断点设在 base.foo()上,就能从 call stack 上看到是由哪个子类调用的了。
iluhcm
2019-01-11 08:26:16 +08:00
你在断点某个类的时候,这个类的所有成员接口变量的实现就已经确定了,只需要按住 opt 并点击这个接口,就可以知道是哪个实现类了。然后可以通过快捷键快速跳转到实现类。
mikicomo
2019-01-11 10:08:45 +08:00
@iluhcm #5 我试试看
mikicomo
2019-01-11 14:16:38 +08:00
@iluhcm #5 试了下,当该类是抽象类并且同时又实现继承了别的类的时候,在抽象方法调用出打断点,按照你的方法,opt 点击这个接口,显示 undefined,好像并没有作用吧?
iluhcm
2019-01-12 21:35:23 +08:00
@mikicomo 怎么可能 undefined,接口在运行时的实现都是已经确定下来了的,除非通过动态代理生成。
mikicomo
2019-01-14 15:00:35 +08:00
@iluhcm #8 可能我姿势不对吧...抽象类调用自己的抽象方法,按照你的方法在我这里不行..

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

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

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

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

© 2021 V2EX