静态分析 C 程序函数调用关系图

参考教程

分析工具对比https://blog.csdn.net/benkaoya/article/details/79750745
cflow + graphviz工具https://blog.csdn.net/benkaoya/article/details/79751000
codeviz + graphviz工具https://blog.csdn.net/benkaoya/article/details/79752738
doxygen + graphviz工具https://blog.csdn.net/benkaoya/article/details/79763668

本文详述在Linux环境下cflow + graphviz的方法。环境为linux16.04

1.安装Callgraph

sudo apt-get install cflow graphviz//下载安装软件cflow graphviz

2.下载安装tree2dotx和Callgraph

wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/tree2dotx
wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/callgraph
sudo cp tree2dotx callgraph /usr/local/bin
sudo chmod +x /usr/local/bin/{tree2dotx,callgraph}

3.问题解决:

问题1:tree2dotx输出结果异常,函数名不全
sudo apt-get install gawk
问题2:在安装过程中出现不能解析网址的问题
原因:网络没接通的原因,重启linux系统

4.具体应用命令和功能说明

1)callgraph --help

/usr/local/bin/callgraph

-f func_name//函数的名字
-d directory|file//函数所在目录和文件
-F filterstr//字符串过滤,砍掉没用的分支
-D depth//流程图的绘制深度
-o directory//设置输出文件名

2)示例说明

示例1:指定目录下hd.c文件的函数.setup
callgraph -f setup -d ./kernel/blk_drv/hd.c
示例2:有没有觉得 printk 之类的调用太多,觉得很繁琐。没关系,用 -F 砍掉
callgraph -f start_kernel -d init/main.c -F printk
示例3:如果要砍掉很多函数,则可以指定一个函数列表:
callgraph -f start_kernel -d init/main.c -F “printk boot_cpu_init rest_init”
示例4:指定函数调用深度:
用 -D 命令可以指定:
callgraph -f start_kernel -d init/main.c -F “printk boot_cpu_init rest_init” -D 2

5原理分析

callgraph 实际上只是灵活组装了三个工具,一个是 cflow,一个是 tree2dotx,另外一个是 dot。

1) cflow:拿到函数调用关系

$ cflow -b -m start_kernel init/main.c > start_kernel.txt

2) tree2dotx: 把函数调用树转换成 dot 格式

$ cat start_kernel.txt | tree2dotx > start_kernel.dot

3) 用 dot 工具生成可以渲染的图片格式

这里仅以 svg 格式为例:

$ cat start_kernel.dot | dot -Tsvg -o start_kernel.svg
实际上 dot 支持非常多的图片格式,请参考它的手册:man dot。

6.关于tree2dotx,可以将整个目录展示出来

1)以 Linux 0.11 为例:

$ cd linux-0.11
$ tree -L 2 | tree2dotx | dot -Tsvg -o tree.svg

2)示例1:

如果觉得一张图显示的内容太多,则可以指定某个当前正在研读的内核目录,例如 kernel 部分:
$ tree -L 2 kernel | tree2dotx -f Makefile | dot -Tsvg -o tree.svg

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值