用 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环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...
随机推荐
- Asp.Net HttpContext.RemapHandler 用法
最近在看HttpHandler映射过程文章时发现Context对象中有一个RemapHandler方法,它能将当前请求映射到指定的HttpHandler处理,可跳过系统默认的Httphandler.它 ...
- Pandas-数据聚合与分组运算
目录 图解"split-apply-combine" 数据的分类split: groupby() 以column进行分组 以index进行分组 分组遍历 数据的应用apply: a ...
- multipart/form-data和application/x-www-form-urlencoded的区别
在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 下边是说明: application/x-www-form-urle ...
- Linux C 字符串函数 sprintf()、snprintf() 详解
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
- C和指针 第十二章 使用结构和指针 双链表和语句提炼
双链表中每个节点包含指向当前和之后节点的指针,插入节点到双链表中需要考虑四种情况: 1.插入到链表头部 2.插入到链表尾部 3.插入到空链表中 4.插入到链表内部 #include <stdio ...
- redmine问题集锦
当我新建LDAP认证模式时,遇到如下错误:
- IDA插件栈字符串识别插件
该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释 如图:可以自动识别栈上的字符串 项目主 ...
- JavaScript——理解闭包及作用
js是一个函数级语言,变量的作用域是: 内部可以访问内部,内部可以访问外部,外部不能访问内部. 如果要在外部,访问函数内部的变量,就要用到闭包.闭包就是指访问到了本不该访问的变量. 闭包作用1:实现封 ...
- nginx负载均衡基于ip_hash的session粘帖
nginx负载均衡基于ip_hash的session粘帖 nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除 ...
- vue学习
2016年12月2日 今天学习Vue.js,对于未知的知识,一脸懵逼.记录学习新知识的路程,为以后学习更多的新知识一个引导.以后学会了之后再回来看看, 回忆一下会与不会的区别在哪.这样以后学习可以更快 ...