有没有一种方法可以获取一个调用关系图?

8
对于Delphi 2010,是否有一种方法可以获取一个图表,以函数X(甚至整个程序)为起点,显示调用了哪些其他函数/过程...类似于以下内容:
Function X
  - Function A
    - Procedure B
    - Procedure C
  - Function D

(当然,图形化会更好看一些...)

1
相关但不同;Delphi Enterprise/Architect UML功能包含支持序列图。我猜这不完全是你所要求的,但它们是相关的。另一个工具的序列图示例在这里:http://www.ibm.com/developerworks/rational/library/3101.html - Warren P
两年后再看这个,我希望原帖作者能够说明他是在寻找静态还是动态调用树。 - Mawg says reinstate Monica
4个回答

9

2
AQTime(现在已经包含在Delphi中)将向您展示特定代码运行的调用树。 - David
AQTime可以进行静态和动态分析,而Peganza PAL只能进行静态分析。AQTime具有更多的图形显示,而Peganza输出是文本,您可以将其输出为平面文本或xml,然后构建自己的图表。PAL无法找到许多动态发生的真实调用链,例如事件回调,甚至派生类覆盖虚拟方法并调用其他未被基类方法调用的内容等等。因此,需要进行动态分析。 - Warren P
顺便提一下,我仍然建议购买PAL,因为它像Borscht一样便宜,并且具有大量出色的“代码卫生”功能,例如Pascal的“Lint工具”。价格不到200美元。比AQTime便宜得多。 - Warren P

3
这是 AQTime 调用图的示例。AQTime 的调用序列可以通过动态方式(从运行中的程序中收集)或静态方式进行收集。动态方式可能需要更多的工作,您可能认为静态分析更好,在某些方面静态分析的确更好,但动态调用序列图实际上是“在一个特定运行中真正发生的事情”,而静态分析提供的是“解析器可以确定始终为真的内容,无论您或您的客户是否运行此代码路径”。事实上,我建议使用两种方法,并将它们进行比较,以了解您学到了什么。

enter image description here

AQTime pro非常昂贵,但我不知道是否有任何免费的替代品。(不,我不为SmartBear或Embarcadero工作。)作为一名专业开发者,我认为这样的工具值得购买。关于是否购买还要看你自己。

通常,我会在性能分析器中运行并使用呼叫序列功能,这样我就可以获得一些时间值(因为数据是由性能分析器动态收集的,而不是由静态分析分析器收集的,后者无法知道函数执行需要多长时间),如下图所示:时间:#.##毫秒


2

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接