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

CodeViz是《Understanding The Linux Virtual Memory Manager》(at Amazon下载地址在页尾)的作者 Mel Gorman 写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有egyptncc)。其基本原理是给 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):

 

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

 

参考:http://read.pudn.com/downloads136/ebook/577717/CodeViz%20——%20一款分析C_C%2B%2B源代码中函数调用关系的调用图生成工具.pdf

时间: 2025-01-21 16:28:47

用CodeViz绘制函数调用关系图(call graph)的相关文章

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

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

使用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,然后用 P

C#实现图(Graph)的算法

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

用Java绘制K线图

Java语言中的Applet(Java小程序)和Application(Java应用程序)是在结构和功能上都存在很大差异的两种不同的编程方式.Applet应用于Web页上,可做出多姿多彩的页面特效,给网站增辉添色:Application则与其他编程语言(如VB.VC)一样,可编制各种应用程序. 本文要讨论的是第一种情况,在Web页上用Java Applet绘制K线图. K线是股市行情分析中的一种参数指标,用股票每日的开盘价.最高价.最低价.收盘价及成交量等数据进行作图,配合五日.十日均线便可反映

图片-数据传输动态关系图解决方案?

问题描述 数据传输动态关系图解决方案? 这种效果哪位做过,或者见过?谢谢了. 解决方案 如果就是这么几条线的话,直接自己绘制就可以了.

R语言的igraph画社交关系图示例

R语言中的igraph可以很方便地画出社交关系图.下面是几个示例. 1.最简单的社交关系图 library(igraph) dolphin <- read.csv('dolphins.csv',head=T,fileEncoding='UTF-8',stringsAsFactors=F) g <- graph.data.frame(dolphin) jpeg(filename='dolphins.jpg',width=800,height=800,units='px') plot(g, ver

C/C++源代码的Include依赖关系图

前一篇博文中我曾仔细介绍过如何查看C/C++代码的依赖项关系图,在这篇文章中我将会介绍如何使用Visualization and Modeling Feature Pack 工具包,查看C/C++源代码的Include关系图,这个功能是针对C/C++编程语言本身的特性而新加入的.在这里我依然会使用工程Hilo 作为案例,展示如何以图形化的方式显示工程中源代码文件与头文件之间Include关系. 首先,在Visual Studio下打开工程Hilo,在菜单栏中选择菜单"体系结构->生成依赖关

用cflow工具生成代码函数调用关系【转】

转自:http://www.cnblogs.com/feng-zi/p/5469652.html 1. 安装 sudo apt-get install cflow 2.使用 cflow [options...] [file]... 例: cflow main.c 生成main.c文件例的函数调用关系 cflow -x main.c 生成交叉引用表,查看函数调用的位置和文件 cflow -o call_tree.txt main.c 生成调用关系并输出到call_tree.txt文件 cflow

jQuery动态效果显示人物结构关系图的方法

  这篇文章主要介绍了jQuery动态效果显示人物结构关系图的方法,涉及jQuery操作json结构数据及鼠标事件的技巧,需要的朋友可以参考下 这是一个人物关系图,可动态展示,效果非常漂亮.点击文字可出现动态关系图的转换效果. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48