用 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环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...
随机推荐
- spark安装(实战)
sparksql+hive :http://lxw1234.com/archives/2015/06/294.htm 1,安装scala http://scala-lang.org/download/ ...
- 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- PYTHON 函数的动态参数
#普通参数示例 def func(args): print(args) func(123456) #执行结果为123456 如果给多个参数,就会报错 #动态参数示例 def func(*args): ...
- (备忘)自定义viewgroup与点击分发事件
public class ScoreButton extends ViewGroup 在类中重写onTouchEvent方法 @Override public boolean onTouchEvent ...
- Python dir
1. 在python命令行交互环境下,可以用dir()函数查看当前的变量,比如: >>> dir()['__builtins__', '__doc__', '__loader__', ...
- How to install Shadow•socks in CentOS7
Helps from: http://www.cmsky.com/shadowsocks-python-install/ http://shadowsocks.blogspot.jp/?m=1 wge ...
- Eclipse关闭XML文件验证的方法
XML的编写是否符合规范,可以通过XML Schema或DTD进行验证,但有时候电脑本来就很卡,而且XML的某些错误并未导致程序无法运行的情况下,暂时关闭XML的验证也算不错的选择. 如web.xml ...
- XSS攻击及防御
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...
- nginx+webpy配置
之前搞app时候学的webpy,一直用的自带webserver,最近研究nginx一段时间,决定二者结合玩一下~ 把搭建的要点总结下,说不定哪天还得用——其实平时手挺懒的... 1 必备模块和背景知识 ...
- 链表原地反转Demo
现在就是Qt开发和给师弟师妹讲下数据结构吧,感觉还挺漫长的,上个Qt帖子等我把成品做出来再更. //Convert_plug.h #ifndef CONVERT #define CONVERT #de ...