您的位置:首页 > 其它

Storm记录07--Maven安装使用

2016-04-08 10:00 281 查看
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
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):



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

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=486788
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: