最近在想怎么把一个程序的函数调用关系快速的用流程图的方式画出来,之后看到了这个一篇文章“用 Graphviz 可视化函数调用”(http://www.ibm.com/developerworks/cn/linux/l-graphvis/)感觉不错,详细的原理请看原文章,这里只把我的实验过程记录下,以备自己以后的不时之需。

1、要有代码,随便写个小程序,如下所示。

#cat test.c

#include <stdio.h>
#include <string.h> void haha();
void hehe()
{
printf("int hehe\n");
haha();
} void test()
{
printf("hehe test\n");
hehe();
haha();
} void haha()
{
printf("in haha\n");
} int main()
{
test();
printf("hello world !\n"); return ;
}

2、要下载一个叫pvtrace的解析工具,我把它放到了百度网盘上:http://pan.baidu.com/s/1sj23YPJ

这个工具解压后的文件如下

# unzip pvtrace.zip
[root@localhost pvtrace]# ls
instrument.c Makefile stack.c stack.h symbols.c symbols.h trace.c

之后编译、安装

[root@localhost pvtrace]# make
gcc -Wall -c trace.c
gcc -Wall -c symbols.c
gcc -Wall -c stack.c
gcc -o pvtrace trace.o symbols.o stack.o
[root@localhost pvtrace]# make install
cp pvtrace /usr/local/bin

3、把pvtrace目录下的instrument.c文件放到你的项目下

# ls
instrument.c Makefile test.c

修改Makefile,编译test.c的时候把这个源文件加上。还有就是在编译选项中加上这个参数 -finstrument-functions

编译自己的项目:

# make
gcc -g -c -o test.o test.c -I../../include -g -finstrument-functions
gcc -g -c -o instrument.o instrument.c -I../../include -g -finstrument-functions
gcc -g -o test test.o instrument.o -L./

4、现在开始生成函数调用的流程图了

运行自己的项目test

# ./test

注:这里有个问题是你的程序运行多少,它记录多少函数之间的关系。你运行的少,它就记录的少,运行的多久记录的多。也就是说,那些暂时没有运行的代码,是不能被记录的。这个在原文章中有说明,因为人家记录的时候就是在运行的时候记录的嘛。

运行完成后会生成一个叫做trace.txt的文件

# ls
instrument.c instrument.o Makefile test test.c test.o trace.txt

接下来使用pvtrace解析这个文件,但是pvtrace后面跟的参数不是trace.txt,而是我们的程序test

[root@localhost drawFuncPic]# pvtrace test
[root@localhost drawFuncPic]# ls
graph.dot instrument.c instrument.o Makefile test test.c test.o trace.txt

生成了gaph.dot文件,接下来就是使用Graphviz的dot工具,把这个graph.dot变成一个图片了。

[root@localhost drawFuncPic]# dot -Tjpg graph.dot -o graph.jpg
[root@localhost drawFuncPic]# ls
graph.dot graph.jpg instrument.c instrument.o Makefile test test.c test.o trace.txt

注:没有Graphviz的话可以去官网下载或者使用命令“#yum install graphviz”进行安装:

# yum install graphviz
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
* base: mirrors.btte.net
* extras: mirrors.yun-idc.com
* updates: mirrors.opencas.cn
Setting up Install Process
Package graphviz-2.26.-.el6.x86_64 already installed and latest version
Nothing to do

我这里有一个安装graphviz的笔记:http://www.cnblogs.com/fengbohello/p/4689131.html

生成的流程图如下:

参考:

http://www.ibm.com/developerworks/cn/linux/l-graphvis/

http://blog.sina.com.cn/s/blog_67fcf49e0101m9r0.html

http://download.csdn.net/download/u011843461/8389925

用 Graphviz+pvtrace 可视化函数调用的更多相关文章

  1. 用 Graphviz 可视化函数调用

    http://www.ibm.com/developerworks/cn/linux/l-graphvis/

  2. doxygen+graphviz轻松绘制函数调用图(call graph)

    前言 之前的工作环境习惯了使用source insight查看函数分析代码,切换到mac下后改用vscode,发现缺少函数调用关系图生成.跨平台的understand可以很好的解决,但是公司没有购买, ...

  3. 安装doxygen(一个自动文档生成工具)+Graphviz图形可视化软件

    参考文章: http://www.fmddlmyy.cn/text21.html http://www.cnblogs.com/duguguiyu/archive/2008/06/29/1231852 ...

  4. 使用doxygen静态分析开源代码

    doxygen是一款生成开源代码说明文件的工具,因为不需要编译源码,用作代码的分析也十分方便. 一.安装 sudo apt-get install graphviz sudo apt-get inst ...

  5. 利用Graphviz 可视化GO 数据库

    GO是一个同源蛋白的数据库,按照三大类别BP(生物学过程), MF(分子功能), CC(细胞组分) 对基因的产物-蛋白质进行了分类: 在GO数据库中,本质上是一个有向无环图的数据结构,在三大类别之下, ...

  6. 分析函数调用关系图(call graph)的几种方法

    绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call sta ...

  7. linux下阅读源代码的工具

    说来真是惭愧呀.一直在用VIM 做开发.却不知道VI 里还有这么好使的工具.以前一直都是用: find -type f -print | xargs grep -i **** 在源代码里查找. 原来L ...

  8. shell基础——字符串处理(转载)

    Shell的字符串处理   1 得到长度   %x="abcd"  #方法一      %expr length $x      4  # 方法二      %echo ${#x} ...

  9. linux下源代码分析和阅读工具比较

    Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...

随机推荐

  1. panel的展开,关闭的一种应用。

    js: <script type="text/javascript"> $('#p2').panel({ title: 'panel1', closable: fals ...

  2. C语言基础(4)-原码,反码,补码及sizeof关键字

    1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...

  3. sql server 2008 数据的行转列

    create table tb(id int, value varchar(10)) insert into tb values(1,'aa') insert into tb values(1,'bb ...

  4. 基于 React.js + Redux + Bootstrap 的 Ruby China 示例 (转)

    一直学 REACT + METEOR 但路由部分有点问题,参考一下:基于 React.js + Redux + Bootstrap 的 Ruby China 示例 http://react-china ...

  5. 我常用的grep命令

    查找包含某个字符的行并保存在文件 grep -rn 'test' ./*.sql >test.sql -r 是递归查找 -n 是显示行号 在当前目录下的.sql结尾的文件中查找包含 test 字 ...

  6. windows7 安装PHP7 本地网站搭建

    2016年5月21日 18:21:12 星期六 PHP7用了vc14编译的, 因此windows要下载安装一个vc14的发行包, 只有16M 2016年6月1日 23:23:52 星期三 利用PHP自 ...

  7. vux 表单提交数据 返回后页面跳转

    ps:仅作参考

  8. yii2.0的分页和排序

    //排序 $sort = new Sort([ 'attributes' => [ 'age' => [ 'asc' => ['age' => SORT_ASC], 'desc ...

  9. mysql时间段内查询

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  10. java中集合的使用

    集合使用: 先说数组:array :用来存同一种数组类型的容器 eg:现在想把班上所有人的信息存起来 1.每一个人的信息可以用一个对象存起来 2.可以用一个数组来接受(现在数组中要接受的是对象) ob ...