codeviz+graphviz分析项目的函数调用关系

0.我使用的环境信息
我是在虚拟机中安装的RHRL5。

1.graphviz的安装(除开程序流程图外,它还可以画很多其他图)
开始我在graphviz的主页上: http://www.graphviz.org/Download.php 没有找到地方下载源码。尴尬啊!
后来在CU下载里: http://download.chinaunix.net/download/0005000/4119.shtml ,下载了tar.gz包。几次安装没有成功。

最后在还是在其主页上找到了rpm包: http://www.graphviz.org/Download_linux_rhel.php 。安装rpm包也不是一帆风顺,因为缺少动态链接库。google之,才晓得红帽有专门的网站,可以下载各个版本的rpm包。
安装软件对于现在的我来说还需要花点时间哦。常常是:(……)

点击(此处)折叠或打开

  1. ./configure
  2. make
  3. make install
但是先看README,INSTALL的习惯,我还是有的。

2.codeviz的安装
http://www.csn.ul.ie/~mel/projects/codeviz/ 下载。
其README里有提示:

点击(此处)折叠或打开

  1. Installing
  2. ----------

  3. cd codeviz
  4. cp ./lib/* -rv /usr/lib/ (Or your preferred perl library path)
  5. cp ./bin/* /usr/local/bin
由于 codeviz-1.0.11.tar.gz ,Finally, support for gcc 3.4.6 was provided by Michael Iatrou.因而还需要下载 gcc-3.4.6.tar.gz,将其放入codeviz-1.0.11/compilers/目录下。也就是说,要分析的程序需要经过打了补丁的gcc-3.4.6编译(*.c文件对应*.c.depn),因此需要注意gcc的路径。

至于为什么这样做:“ 由于CodeViz实际上是给gcc打了补丁,然后重新编译gcc,这就涉及到你自己编译 的gcc的安装路径.其路径是Makefile变量中的${GCCGRAPH}定义的,你修改该路径则可以指定你自己编译的 gcc的安装路径,默认的是/usr/local/gccgraph.[推荐不要改变该默认值] ”。

CU下载比较方便,可是是gcc-3.4.6.tar.bz。我试了下,第一次没有成功。还是下个tar.gz , http://ftp.gnu.org/gnu/gcc/gcc-3.4.6/
编译的过程真的有点漫长~

3.axel程序的函数调用关系
这个程序是在CU论坛 源码阅读第一期:axel和wget 中的一个程序。可是我至今没有去分析~
我的一个简单shell脚本,用于产生某个函数的调用图:

点击(此处)折叠或打开

  1. #!/bin/sh
  2. /usr/local/gccgraph/bin/gcc -c *.c *.cc
  3. #产生
  4. genfull  
  5. read fun
  6. gengraph --output-type png --no-extern -f ${fun}
生成的full.graph文件部分内容,还是比较好懂的。

点击(此处)折叠或打开

  1. digraph fullgraph {
  2. node [ fontname=Helvetica, fontsize=12 ];
  3. "ftp_wait" [label="ftp_wait\nftp.c:297:"];
  4. "axel_divide" [label="axel_divide\naxel.c:574:"];
  5. "save_state" [label="save_state\naxel.c:499:"];
  6. "axel_start" [label="axel_start\naxel.c:218:"];
  7. "search_makelist" [label="search_makelist\nsearch.c:66:"];
  8. "print_messages" [label="print_messages\ntext.c:583:"];
  9. .......
  10. "stat" -> "__xstat" [label="/usr/include/sys/stat.h:436"];
  11. "lstat" -> "__lxstat" [label="/usr/include/sys/stat.h:443"];
  12. "fstat" -> "__fxstat" [label="/usr/include/sys/stat.h:450"];
  13. "mknod" -> "__xmknod" [label="/usr/include/sys/stat.h:466"];
先上两张axel程序main函数的调用关系图(比较一下,吸引大家的兴趣~)
包含库函数:(有点大2.0Mb)


不包含库函数:(0.4Mb)
codeviz+graphviz分析项目的函数调用关系_第1张图片
使用帮助信息更好地掌握其使用,很简单明了:
genfull --help
gengraph --help
在网上找到一个“ CodeViz —— 一款分析C/C++源代码中函数调用关系的调用图生成工具 ”分享给大家。
 CodeViz 一款分析CC++源代码中函数调用关系的调用图生成工具.zip    

4.疑问
gcc-4.XX与gcc-3.4.6区别?
genfull生成的full.graph有各个函数的标号。但是我发现如果自定义的一个函数没有调用库函数的话,那么这个自定义的函数不能被识别???这个???

5.参考

用CodeViz产生函数调用图(原创)http://barry-popy.blog.sohu.com/31629163.html



转自:http://blog.chinaunix.net/uid-25194149-id-3218529.html

你可能感兴趣的:(软件调试,C/C++)