使用Graphviz + CodeViz生成C/C++函数调用图(call graph)

一、Graphviz + CodeViz简单介绍

CodeViz是《Understanding The Linux Virtual Memory Manager》的作者 Mel Gorman 写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有 egypt、ncc)。其基本原理是给 GCC 打个补丁(如果你的gcc版本不符合它的要求还得先下载正确的gcc版本),让它在编译每个源文件时 dump 出其中函数的 call graph,然后用 Perl 脚本收集并整理调用关系,转交给Graphviz绘制图形(Graphviz属于后端,CodeViz属于前端)。

CodeViz 原本是作者用来分析 Linux virtual memory 的源码时写的一个小工具,现在已经基本支持 C++ 语言,最新的 1.0.9 版能在 Windows + Cygwin 下顺利地编译使用。

基本介绍就到这儿,如果你对其原理比较感兴趣,可以参考这篇文章:分析函数调用关系图(call graph)的几种方法

二、Graphviz + CodeViz编译安装

1. 安装 GraphViz调用图的生成依赖于 GraphViz,所以首先要安装 GraphViz。可以下载源码包编译、安装(下载主页:http://www.graphviz.org/Download.php)。

如果是Ubuntu系统可以直接apt安装: sudo apt-get install graphviz

2. 安装 CodeViz下载CodeVize源码包:http://www.csn.ul.ie/~mel/projects/codeviz/

解压:tar xvf codeviz-1.0.12.tar.gz (目前最新版是1.0.12)

进入解压后的目录:cd codeviz-1.0.12/

CodeViz 使用了一个 patch 版本的 GCC 编译器,而且不同的 CodeViz 版本使用的GCC 版本也不同,可以下载 CodeViz 的源码包后查看 Makefile 文件来确定要使用的 GCC 版

本,codeviz-1.0.12 使用 GCC-4.6.2。实际上安装 CodeViz 时安装脚本make会检查当前的GCC版本如果不符合则会自动下载对应的 GCC并打 patch,但由于GCC较大如果网速不好且在虚拟机中的话容易下载失败或系统错误什么的,因此这里我们还是分步安装比较好,先安装gcc再回来安装CodeViz。

(1)安装 GCC

下载gcc-4.6.2.tar.gz到 cd codeviz-1.0.12目录下的compilers里。

下载地址:ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.6.2/gcc-4.6.2.tar.gz

CodeViz 的安装脚本 compilers/install_gcc-4.6.2.sh 会自动检测 compilers 目录下是否有 gcc 的源码包,若没有则自动下载并打 patch。这里前面已经下载,直接移到该目录即可,则剩下的就是解压安装了。install_gcc-3.4.6.sh 会解压缩 gcc打 patch,并将其安装到指定目录,若是没有指定目录,则缺省使用$HOME/gcc-graph,通常指定安装在/usr/

local/gcc-graph(这时需要 root 权限)。

安装: ./install_gcc-4.6.2.sh

注意:这里可能安装时有些错误,具体错误及解决方案见后面。

(2)安装 CodeViz

./configure && make install-codeviz

注1:不需要 make ,因为make的作用就是检测是否有gcc若没有则下载源码包,所以这里只要安装 codeviz 即可。具体查看 Makefile 文件。

注意:这里为什么不是通常用的make install,因为这里make install的作用是先安装gcc再安装codeviz,而前面已经安装了 gcc,所以这里只需要安装 codeviz ,即make install-codeviz脚本,该脚本也就是将genfull 和 gengraph 复制到/usr/local/bin 目录下。

目前为止,CodeViz 安装完成了。

时间: 2024-10-30 03:15:21

使用Graphviz + CodeViz生成C/C++函数调用图(call graph)的相关文章

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

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

《Python自动化运维:技术与最佳实践》一3.3 生成动态路由轨迹图

3.3 生成动态路由轨迹图 scapy(http://www.secdev.org/projects/scapy/)是一个强大的交互式数据包处理程序,它能够对数据包进行伪造或解包,包括发送数据包.包嗅探.应答和反馈匹配等功能.可以用在处理网络扫描.路由跟踪.服务探测.单元测试等方面,本节主要针对scapy的路由跟踪功能,实现TCP协议方式对服务可用性的探测,比如常用的80(HTTP)与443(HTTPS)服务,并生成美观的路由线路图报表,让管理员清晰了解探测点到目标主机的服务状态.骨干路由节点所

jfreechart jsp mysql-jfreechart怎么从mysql读取数据生成柱状图饼状图并显示到web页面

问题描述 jfreechart怎么从mysql读取数据生成柱状图饼状图并显示到web页面 jfreechart怎么从mysql读取数据生成柱状图饼状图并显示到web页面,最好能有个实例.

C#放缩、截取、合并图片并生成高质量新图的类

原文:C#放缩.截取.合并图片并生成高质量新图的类 using System;using System.Drawing;using System.Drawing.Imaging;using System.Drawing.Drawing2D;using System.IO; namespace Framework{public class ImageClass{        public Image ResourceImage;        public int Width=0;       

winform如何生成界面的矢量图,大神帮忙,急,在线等

问题描述 如何生成一个winform界面的矢量图,是整个界面,就是说界面是什么样子,生成的图片就是什么样子,最好是矢量图,因为矢量图无限放大不会失真,我现在调用的是form1.DrawToBitmap()这个方法可以生成界面的图片,但不是矢量图,放大会失真,那怎么样才能生成界面的矢量图呢,求大神解决,最好贴上代码,万分感谢!如果实在生成不了矢量图,那么怎么生成指定分辨率的界面图片,最好是矢量图了! 解决方案 解决方案二:哥哥姐姐帮帮忙哦,急解决方案三:界面的截图图怎么会是矢量图呢截屏方法>htt

VS2013 生成关系依赖项图的时候出错

问题描述 C#项目,生成关系依赖项图的时候出错,换了项目还是出错,选中项目,右键菜单选择[在代码图上显示],出现一样的错误提示,同学电脑上的VS可以显示,应该是自己的VS哪里设置错了,自己的程序没有使用SQL_SERVER,但是提示数据库连接错误,具体如图:

C#实现图(Graph)的算法

简介 图表示点之间的关系,在C#中通过节点对象的集合来表示点(Vertex),用邻接矩阵(adjacency matrix)来表示点之间的关系.下面来看C#实现. PS:本片文章是我复习的笔记,代码注释很全.勿吐槽. 表示点的对象 下面实现代码: class Vertex { publicstring Data; publicbool IsVisited; public Vertex(string Vertexdata) { Data = Vertexdata; } } 每个节点包含两个字段,分

用CodeViz绘制函数调用关系图(call graph)

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绘制图形. Code

用GD图库生成横竖柱状图折线图的类

折线图|柱状图 最近写的一个GD图库用以生成横竖柱状图和折线图的类库,算是一个教学例程吧  <? Class ImageReport{ var $X;//图片大小X轴 var $Y;//图片大小Y轴 var $R;//背影色R值 var $G;//...G. var $B;//...B. var $TRANSPARENT;//是否透明1或0 var $IMAGE;//图片对像 //------------------- var $ARRAYSPLIT;//指定用于分隔数值的符号 var $ITE