说明:本文中介绍的分析工具只适用于分析Python3的程序运行过程。
Call Graph 简介
调用图可以是动态的或静态的。动态调用图是程序执行的记录,因此,动态调用图尽管是准确的,但仅描述了该程序的一次运行。而静态调用图则旨在展示程序的所有可能的调用过程。确切的静态调用图是一个无法NP问题,因此静态调用图的产生算法通常只能是以overapproximations的方式去近似。也就是说,在图中表示的一些调用关系,可能在实际的运行过程中根本不会发生。
在不同语言和场景中有不同的Call Graph 分析工具,详情参考这里。在本文中我们将会介绍适用于python代码分析的动态调用图分析工具 pycallgraph和静态调用图分析工具 pyan。前者远比后者有名,但是我们确实两个都需要。而且后者因为不需要运行程序就能直接对程序进行分析,所以更加快速便捷。
下面我们使用 pycallgraph 给出的python程序例子作为我们的分析材料:
class Banana:
def eat(self):
pass
class Person:
def __init__(self):
self.no_bananas()
def no_bananas(self):
self.bananas = []
def add_banana(self, banana):
self.bananas.append(banana)
def eat_bananas(self):
[banana.eat() for banana in self.bananas]
self.no_bananas()
def main():
person = Person()
for a in range(10):
per