1、安装
sudo apt-get install cflow
2、使用
通过cflow --help
可以查看使用方法,主要有以下几个常用的选项:
- -A, --all:展示所有函数,不仅仅是从main函数调用的;
- -b, --brief:简要输出;
- –cpp[=COMMAND]:运行指定的预处理命令;
- -d, --depth=NUMBER:设置流程图被切断的深度;
- -D, --define=NAME[=DEFN]:预定义名字作为宏;
- -f, --format=NAME:使用给定输出格式名,可选的有gnu(默认)和posix;
- -I, --include-dir=DIR:添加DIR到搜索头文件的目录表中;
- -m, --main=NAME:指定需要分析的函数名;
- -n, --number:打印行号;
- -o, --output=FILE:设置输出文件,默认为标准输出;
- -T, --tree:描画调用图;
2.1 示例
/* file: test.c */
#include <stdio.h>
void func_5(void){
printf("hello!\n");
}
void func_4(void){
func_5();
}
void func_3(void){
func_4();
}
void func_2(void){
func_3();
}
void func_1(void){
func_2();
}
int main()
{
func_1();
func_4();
return 0;
}
执行以下命令:
book@book-VirtualBox:~$ cflow -T -n test.c -m main
1 +-main() <int main () at test.c:25>
2 +-func_1() <void func_1 (void) at test.c:21>
3 | \-func_2() <void func_2 (void) at test.c:17>
4 | \-func_3() <void func_3 (void) at test.c:13>
5 | \-func_4() <void func_4 (void) at test.c:9>
6 | \-func_5() <void func_5 (void) at test.c:5>
7 | \-printf()
8 \-func_4() <void func_4 (void) at test.c:9>
9 \-func_5() <void func_5 (void) at test.c:5>
10 \-printf()
2.2 cflow搭配其他工具绘制调用图
安装:
# tree2dotx
sudo wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/tree2dotx -O /usr/bin/tree2dotx
sudo chmod +x /usr/bin/tree2dotx
# graphviz
sudo apt-get install graphviz
使用:
cflow test.c | tree2dotx > test.dot
dot -Tgif test.dot -o test.gif
有时候好像不是很好用,因为生成的图像不太正确,但还是简单做下记录吧。另外,还有一款软件不需要借助第三方的软件也可以直接生成dot格式文件,它就是calltree,使用方法可以参考链接。
参考文章: