图形化显示 Python 函数之间的调用关系

栏目: Python · 发布时间: 7年前

内容简介:由于最近在分析 Python 写成的项目的代码,但是由于项目庞大、设计函数繁多、调用关系复杂,往往单纯地依靠肉眼和注释等方式去记录或者是使用 Pycharm 等编译工具去动态的调试在我看来都不能满足我对整个项目运行过程清楚理解的需要,因此就需要一款工具能比较方便的记录程序运行过程中的函数调用关系,最好还能使用图形化的形式表示出来,就非常类似于 IDA 的函数流程框图的功能,我找了一下还真有这样的好用的东西,于是这里简单的记录一下,方便后面的使用。下载地址:注意:安装路径可任意选择

由于最近在分析 Python 写成的项目的代码,但是由于项目庞大、设计函数繁多、调用关系复杂,往往单纯地依靠肉眼和注释等方式去记录或者是使用 Pycharm 等编译 工具 去动态的调试在我看来都不能满足我对整个项目运行过程清楚理解的需要,因此就需要一款工具能比较方便的记录程序运行过程中的函数调用关系,最好还能使用图形化的形式表示出来,就非常类似于 IDA 的函数流程框图的功能,我找了一下还真有这样的好用的东西,于是这里简单的记录一下,方便后面的使用。

0X01 安装方法

1.下载并安装graphviz

下载地址: https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

注意:安装路径可任意选择

2.配置环境变量

比如我的安装路径是

E:\Graphviz2.38

那么就在系统环境变量 path 中添加下面的项

E:\Graphviz2.38\bin

3.安装 pycallgraph

pip install pycallgraph

0X02 使用方法

1.在项目主函数所在文件中引入依赖包

比如如果我分析的是 sqlmap ,那么我们可以在 sqlmap.py 中添加下面的依赖

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
from pycallgraph import Config
from pycallgraph import GlobbingFilter

如下图所示:

图形化显示 Python 函数之间的调用关系

注意:

这里有一个点就是有些项目可能会规定某些 import

必须在第一行,那么如果这时候你把这个引用放在最上面可能项目不能正常运行,这要根据不同的项目而定

2.设定要显示或者不要显示的函数

我们在 if __name__ == "__main__": 下,main() 之上可设置我们想要在图中显示的函数和想要隐藏的函数(这个设置不是必须的,在我的使用中就没有特殊的需要,我便没有设置)

def main():
    # 你的主函数代码。

if __name__ == "__main__":
    # 下面是添加部分
    config = Config()
    # 关系图中包括(include)哪些函数名。
    #如果是某一类的函数,例如类gobang,则可以直接写'gobang.*',表示以gobang.开头的所有函数。(利用正则表达式)。
    config.trace_filter = GlobbingFilter(include=[
        'main',
        'draw_chessboard',
        'draw_chessman',
        'draw_chessboard_with_chessman',
        'choose_save',
        'choose_turn',
        'choose_mode',
        'choose_button',
        'save_chess',
        'load_chess',
        'play_chess',
        'pop_window',
        'tip',
        'get_score',
        'max_score',
        'win',
        'key_control'
    ])
    # 该段作用是关系图中不包括(exclude)哪些函数。(正则表达式规则)
    # config.trace_filter = GlobbingFilter(exclude=[
    #     'pycallgraph.*',
    #     '*.secret_function',
    #     'FileFinder.*',
    #     'ModuleLockManager.*',
    #     'SourceFilLoader.*'
    # ])
    ...

3.main()前调用我们的绘图函数

...
graphviz = GraphvizOutput()
graphviz.output_file = 'graph.png'
with PyCallGraph(output=graphviz, config=config):
    main()

如图所示:

图形化显示 Python 函数之间的调用关系

注意:

因为我这里没有特别的配置于是 PyCallGraph() 函数里没有上面代码中的 config 选项

0X03 运行结果

1.运行我的 sqlmap.py

图形化显示 Python 函数之间的调用关系

2.在当前目录下生成指定图片

图形化显示 Python 函数之间的调用关系

3.图片效果

图形化显示 Python 函数之间的调用关系

0X04 总结

现在可以愉快地开始我们的分析之旅了!

0X05 参考


以上所述就是小编给大家介绍的《图形化显示 Python 函数之间的调用关系》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

因计算机而强大

因计算机而强大

[美]西摩 佩珀特 Seymour Papert / 梁栋 / 新星出版社 / 2019-1 / 38

本书有两个中心主题—— 孩子可以轻松自如地学习使用计算机; 学习使用计算机能够改变他们学习其他知识的方式。 (前苹果公司总裁 约翰·斯卡利) 最有可能带来文化变革的就是计算机的不断普及。 计算机不仅是一个工具,它对我们的心智有着根本和深远的影响。 计算机不仅帮助我们学习 ,还帮助我们学习怎样学习。 计算机是一种调解人与人之间关系的移情对象。 一个数学的头脑......一起来看看 《因计算机而强大》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具