用 Graphviz+pvtrace 可视化函数调用
最近在想怎么把一个程序的函数调用关系快速的用流程图的方式画出来,之后看到了这个一篇文章“用 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 可视化函数调用的更多相关文章
- 用 Graphviz 可视化函数调用
http://www.ibm.com/developerworks/cn/linux/l-graphvis/
- doxygen+graphviz轻松绘制函数调用图(call graph)
前言 之前的工作环境习惯了使用source insight查看函数分析代码,切换到mac下后改用vscode,发现缺少函数调用关系图生成.跨平台的understand可以很好的解决,但是公司没有购买, ...
- 安装doxygen(一个自动文档生成工具)+Graphviz图形可视化软件
参考文章: http://www.fmddlmyy.cn/text21.html http://www.cnblogs.com/duguguiyu/archive/2008/06/29/1231852 ...
- 使用doxygen静态分析开源代码
doxygen是一款生成开源代码说明文件的工具,因为不需要编译源码,用作代码的分析也十分方便. 一.安装 sudo apt-get install graphviz sudo apt-get inst ...
- 利用Graphviz 可视化GO 数据库
GO是一个同源蛋白的数据库,按照三大类别BP(生物学过程), MF(分子功能), CC(细胞组分) 对基因的产物-蛋白质进行了分类: 在GO数据库中,本质上是一个有向无环图的数据结构,在三大类别之下, ...
- 分析函数调用关系图(call graph)的几种方法
绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call sta ...
- linux下阅读源代码的工具
说来真是惭愧呀.一直在用VIM 做开发.却不知道VI 里还有这么好使的工具.以前一直都是用: find -type f -print | xargs grep -i **** 在源代码里查找. 原来L ...
- shell基础——字符串处理(转载)
Shell的字符串处理 1 得到长度 %x="abcd" #方法一 %expr length $x 4 # 方法二 %echo ${#x} ...
- linux下源代码分析和阅读工具比较
Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...
随机推荐
- 如何删除xcode项目中不再使用的图片资源
1. 利用工具 下载地址 http://jeffhodnett.github.io/Unused/ 运行效果如下 2. 通过终端 执行 shell 命令 a. 第一步建立.sh 文件 如 ...
- visio二次开发——图纸解析
(转发请注明来源:http://www.cnblogs.com/EminemJK/) visio二次开发的案例或者教程,国内真的非常少,这个项目也是花了不少时间来研究visio的相关知识,困难之所以难 ...
- 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ Tab)
一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得前两篇文章吗.主要讲述了以“jQuery的方式如何开发插件”,以及过程化设计与面向对象思想设计相结合的方式是 如何设计一个插件的,两种方式各有利 ...
- cf723c Polycarp at the Radio
Polycarp is a music editor at the radio station. He received a playlist for tomorrow, that can be re ...
- Linux的用户及用户组
一./etc/group下存储当前系统中所有的用户组信息 -Group: x : 123 :abc,def,xyz -组名称:组密码占位符:组编号:组中用户名列表 二./etc/gshado ...
- 进阶系列二【绝对干货】---Quartz.Net的入门
一.Quartz.Net是什么? Quartz.Net是一个开源的作业调度框架,OpenSymphony的开源项目,是Quartz的C#移植项目.非常适合在平时的工作中,定时轮询数据库同步,定时邮件通 ...
- Java GridBagLayout 简单使用
这里只介绍了很基础布局构建及使用,主要是关于 GridBagLayout. 首先整套流程大概是, 声明一个 GridBagLayout 对象 private GridBagLayout gridBag ...
- URL类型入参串调用接口
最近通过调用另一个合作公司提供的接口实现方法,借鉴同事之前编写的方法 Models.JSON.Patient类中有各种属性,也可增加属性来满足新需求 public string TakeAppoint ...
- Emmet,让你爱上敲代码
原文链接:http://m.blog.csdn.net/article/details?id=53484535 不错 —— 由 都不要欺负我 分享 Emmet 是一个可用在许多流行文本编辑器上的极大简 ...
- Java中简单的操作(if语句、常用操作符、switch语句、变量赋值等)
---------------------if语句介绍--------------------------------------------------- class IfDemo { public ...