静态分析 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