用处

要想了解大型工程的运行原理和过程,分析其函数调用关系是一个很有用的方法。比起自己一个个搜索、记录,使用工具效率会更高。Source Insight 就有一个显示函数调用关系的功能,非常好用。

PS:之前我都是手动搜索、记录,去理清函数调用关系。甚至添加打印,在程序运行时理清函数调用关系。现在回想起来好低能且低效。

操作

如图所示,点击①处的【Relation Window】按钮,就会出现右侧【Relation】窗口。该窗口下方有三种显示模式可供选择,我比较喜欢垂直的图像显示模式(如果调用关系能从上到下显示,而不是从下到上显示,就更好了),并且该窗口默认只显示一层调用关系,我们需要显示更多,这个后面会讲。当你随便点击源码中的某个函数或变量时,【Relation】窗口就会展示出该函数或变量的调用关系。

source insight 查看android源码 sourceinsight查看调用关系_函数调用


如果有时点击了函数,【Relation】窗口中的图像没有变化,可以点击②处的按钮重新生成一下。

过滤

不过,可以看到,【Relation】窗口中的函数调用关系貌似有点问题

source insight 查看android源码 sourceinsight查看调用关系_Source Insight_02


怎么 hostapd_add_iface 显示调用了它自己,看代码也没发现它是递归函数呀,怎么回事。仔细看了一下,发现这两个函数前的图标不一样,鼠标悬停在它俩上方,发现下边那个是函数声明,上边那个才是函数定义。显然,我们只关心函数定义,声明在这里只会徒增麻烦,那怎样才能去掉呢?

source insight 查看android源码 sourceinsight查看调用关系_Source Insight_03


点击【Relation】窗口下方的设置按钮,会弹出【Relation Window Options】窗口,上文中提到的层级也是在这里设置的,我这里设置为了最大也就是 10 级。然后点击【Symbol Types Filter】按钮,取消勾选【Function Prototype】,勾选这个选项会显示函数原型,也就是函数声明

source insight 查看android源码 sourceinsight查看调用关系_函数定义_04


点击【OK】,然后【Relation】窗口就变成了下图

source insight 查看android源码 sourceinsight查看调用关系_函数定义_05


很清晰明了了有木有。

优化

还没完,我们还可以点击【Graph Options】来修改显示元素的属性,让显示更加美观。

source insight 查看android源码 sourceinsight查看调用关系_函数定义_06


修改后

source insight 查看android源码 sourceinsight查看调用关系_函数调用_07


完结!