用 Graphviz + CodeViz可视化函数调用

安装


安装 GraphViz



调用图的生成依赖于 GraphViz,所以首先要安装 GraphViz。可以下载源码包编译、安装。

sudo apt-get install graphviz

下载CodeViz



下载CodeVize源码包

wget http://www.csn.ul.ie/~mel/projects/codeviz/codeviz-1.0.12.tar.gz

tar xvf codeviz-1.0.12.tar.gz
cd codeviz-1.0.12

安装patch的gcc



CodeViz 使用了一个 patch 版本的 GCC 编译器,而且不同的 CodeViz 版本使用的GCC 版本也不同

可以下载 CodeViz 的源码包后查看 Makefile 文件来确定要使用的 GCC 版

本,codeviz-1.0.11 使用 GCC-3.4.6。实际上安装 CodeViz 时安装脚本会自动

下载对应的 GCC并打 patch,但是这里我们是分步安装,还是清楚一点好, 先安装gcc再回来安装CodeViz。

CodeViz 的安装脚本 compilers/install_gcc-3.4.6.sh 会自动检测 compilers 目录下是否有 gcc 的源码包,若是没有则自动下载并打 patch,这里前面已经下载,直接移到该目录即可,则剩下的就是解压安装了。

install_gcc-3.4.6.sh 会解压缩 gcc,打 patch,并将其安装到指定目录,若是没有指定目录,则缺省使用HOME/gcc?graph,通常指定/usr/local/gcc?graph(这时需要root权限)。tbag@: /down/codeviz?1.0.11 cd compilers/

[email protected]:~/down/codeviz-1.0.11/compilerslsgcc?3.4.6.tar.gzgcc?graphgcc?patchesinstallgcc?3.4.6.shtbag@: /down/codeviz?1.0.11/compilers ./install_gcc-3.4.6.sh

接下来就可以去喝杯咖啡了。。。。。

安装 CodeViz

[email protected]:~/down/codeviz-1.0.11./configuretbag@: /down/codeviz?1.0.11 make

# make (这里不需要是因为在脚本中不会检测是否已经 make 了 gcc-3.4.6,前

面已经作过了,所以只要安装 codeviz 即可。编译的目标只是 gcc-3.4.6,codeviz 不需要编

译。具体查看 Makefile 文件)

[email protected]:~/down/codeviz-1.0.11$ make install-codeviz

(前面已经安装了 gcc,所谓的安装 codeviz 只是将make install-codeviz

脚本 genfull 和 gengraph 复制到/usr/local/bin 目录下。codeviz 需要 perl 库的支持,我

的系统上缺省安装了 perl,所以没有出现什么问题。若是安装出现问题,则查看

configure 和 Makefile 确定需要安装哪些库即可)

目前为止,CodeViz 安装完成了,下面看一下它的使用吧。

4.使用

GraphViz 支持生成不同风格的调用图,但是一些需要安装额外的支持工具或者库程序,

有兴趣的朋友可以到 http://www.graphviz.org 上查找相关资料。这里重点讲述 CodeViz 的

使用方法,具体的图像风格控制不再详述。

CodeViz 使用两个脚本来生成调用图,一个是 genfull,该脚本可以生成项目的完整调

用图,因此调用图可能很大很复杂,缺省使用 cdepn 文件来创建调用图;另一个是

gengraph,该脚本可以对给定一组函数生成一个小的调用图,还可以生成对应的

postscript 文件。安装时这两个脚本被复制到/usr/local/bin 目录下,所以可以直接使用

而不需要指定路径。

5.编译

打了 patch 的 gcc/g++为编译的每个 C/C++文件生成.cdepn 文件,该文件包含函数调

用信息、声明信息等等。

演示:

1) [email protected]:~/test/ jpeg$ http://www.cnblogs.com/gcc-graph/bin/gcc *.c -o tbag

2) [email protected]:~/test/ jpeggenfull3)tbag@: /test/jpeg gengraph -d 2 -output-type “png” -f jpeg_decompress2bmp

第一步,使用刚刚安装的gcc-3.4.6来编译当前目录下所有.c文件,gcc/g++为编译的每个 C/C++文件生成.cdepn 文件。

第二步:使用此脚本会在当前目录生成一个full.graph文件,该脚本可以生成项目的完整调

用图信息文件, 因此调用图信息文件可能很大很复杂, 缺省使用 cdepn 文件来创建调用图信息文件;

第三步:该脚本可以对给定一组函数生成一个小的调用图, ‘-d 2’参数是只显示两层调用关系,‘ -output-type “png”’指定 输出格式为png,‘-f jpeg_decompress2bmp’指定从哪个函数开始生成调用关系图。

http://blog.csdn.net/Solstice/archive/2005/09/22/486788.aspx

CodeViz是《Understanding The Linux Virtual Memory Manager》(at Amazon,下载地址在页尾)的作者 Mel Gorman 写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有 egypt、ncc)。其基本原理是给 GCC 打个补丁,让它在编译时每个源文件时 dump 出其中函数的 call graph,然后用 Perl 脚本收集并整理调用关系,转交给Graphviz绘制图形。

CodeViz 原本是作者用来分析 Linux virtual memory 的源码时写的一个小工具,现在已经基本支持 C++ 语言,最新的 1.0.9 版能在 Windows + Cygwin 下顺利地编译使用:)。需要注意的是:1) 下载 GCC 3.4.1 的源码 gcc-3.4.1.tar.gz 放到 codeviz-1.0.9/compilers,2) 安装 patch 程序(属于Utils类),3) 从 http://www.graphviz.org 下载并安装 Graphviz 2.6。

我用 CodeViz 分析《嵌入式实时操作系统 uC/OS-II (第二版)》中的第一个范例程序,步骤如下:

  1. 想办法让 gcc 能编译uC/OS 2.52和范例程序的源码,每个C源文件生成对于的.c.cdepn文件。只要编译(参数 -c)就行,无需连接。
  2. 调用genfull生成full.graph,这个文件记录了所有函数在源码中的位置和它们之间的调用关系。
  3. 使用gengraph生成我关心的函数的调用关系。

首先分析main():

  1. gengraph –output-type gif -f main

    分析main()的call graph,得到的图如下,看不出要领:

  2. gengraph –output-type gif -f main -s OSInit

    暂时不关心OSInit()的内部实现细节(参数 -s),让它显示为一个节点。得到的图如下,有点乱,不过好多了:

  3. gengraph –output-type gif -f main -s OSInit -i “OSCPUSaveSR;OSCPURestoreSR”

    基本上每个函数都会有进入/退出临界区的代码,忽略之(参数 -i)。得到的图如下,基本清楚了:

  4. gengraph –output-type gif -f main -s “OSInit;OSSemCreate” -i “OSCPUSaveSR;OSCPURestoreSR” -k

    OSSemCreate()的内部细节似乎也不用关心,不过保留中间文件sub.graph(参数 -k),得到的图如下,

  5. dot -Tgif -o main.gif sub.graph

    修改sub.graph,使图形符合函数调用顺序,最后得到的图如下,有了这个都不用看代码了:)

接着分析OSTimeDly()的被调用关系:

gengraph –output-type gif -r -f OSTimeDly

看看哪些函数调用了OSTimeDly(),参数 -r ,Task()和TaskStart()都是用户编写的函数:

最后看看Task()直接调用了哪些函数:

gengraph –output-type gif -d 1 -f Task

只看从Task出发的第一层调用(参数 -d 1):

在分析源码的时候,把这些图形打印在手边,在上面做笔记,实在方便得很。

时间: 2024-10-29 19:06:10

用 Graphviz + CodeViz可视化函数调用的相关文章

用 Graphviz+pvtrace 可视化函数调用

最近在想怎么把一个程序的函数调用关系快速的用流程图的方式画出来,之后看到了这个一篇文章“用 Graphviz 可视化函数调用”(http://www.ibm.com/developerworks/cn/linux/l-graphvis/)感觉不错,详细的原理请看原文章,这里只把我的实验过程记录下,以备自己以后的不时之需. 1.要有代码,随便写个小程序,如下所示. #cat test.c #include <stdio.h> #include <string.h> void haha

看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph) - 转

From http://www.linuxidc.com/Linux/2015-01/111501.htm 实际按照上文操作,主要是安装gcc-4.6.2出现一些问题,原先在cygwin下安装,结果提示缺少3个东西,编译gcc失败. centos下,yum -y install mpfr-devel libmpc-devel gmp-devel 后来又提示错误,(我是在64位Centos下安装的),于是需要安装glibc-devel.i686,可能也需要安装libgcc.i686.对 第一次安装

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

分析函数调用关系图(call graph)的几种方法 绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call stack窗口,能节约一些脑力.不过如果要分析的是脚本语言的代码,那多半只好老老实实用第一种方法了.如果在读代码之前,手边就有一份调用图,岂不妙哉?下面举出我知道的几种免费的分析C/C++函数调用关系的工具. 函数调用关系图(call graph)是图

linux下阅读源代码的工具

source insight 使用教程:http://wenku.baidu.com/link?url=AWmefe23g3AJRja3sGIky8rhmDELYXK9xQHGW137Cjk4qkItt5t8asR4XJqtMpY0GRsL8bnvljzeVRaxVNTzEDVdudmkJqltuWqq6z2Rla_On2mW8sx15bicICLxPwuDwqcUDZHuIq5o6eMdReo0bAzQK24ZYRYT-p0EdV7UaLu 说来真是惭愧呀.一直在用VIM 做开发.却不知道VI

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

linux内核调试指南

linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环境的建立 gdb基础 基本命令 gdb之gui gdb技巧 gdb宏 汇编基础--X86篇 用户手册 AT&

机器学习算法实践:决策树 (Decision Tree)(转载)

前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决策树种涉及到的 算法进行总结并附上自己相关的实现代码.所有算法代码以及用于相应模型的训练的数据都会放到GitHub上(https://github.com/PytLab/MLBox). 本文中我将一步步通过MLiA的隐形眼镜处方数集构建决策树并使用Graphviz将决策树可视化. 决策树学习 决策树

决策树(统计学习方法(李航))的贷款的例子的实现

以统计学习方法(李航)这本书的例子为基础 需要注意的地方: 我用的是pycharm python版本是3.7 graphviz是一个软件,在pycharm里面下了还得去官网下 下完之后得加入环境变量可能还需要重启电脑 缺啥库就安啥库 那个数据是我自己设置的,手敲的. 贷款申请样本数据表 ID 年龄 有工作 有自己的房子 信贷情况 类别 1 青年 否 否 一般 否 2 青年 否 否 好 否 3 青年 是 否 好 是 4 青年 是 是 一般 是 5 青年 否 否 一般 否 6 中年 否 否 一般 否

[转] 使用CodeViz生成C/C++函数调用关系图

运行环境:虚拟机下的Ubuntu 11.04 结合Graphviz工具,使用CodeViz可以生成直观和漂亮的C/C++程序函数之间的调用关系图. 1.安装graphviz 在安装CodeViz之前,必须先安装它所依赖的工具dot,否则将无法完成./configure操作并提示以下错误信息: checking for dot...not found FATAL: The program dot was not in your path. This is probably available fo