用 Graphviz 可视化函数调用

来源:互联网 发布:数据库开发是做什么的 编辑:程序博客网 时间:2024/04/29 08:10

主要参考来自这里,http://www.ibm.com/developerworks/cn/linux/l-graphvis/

主要操作

  1. 安装graphviz,在fedora下yum install graphviz-devel。
  2. 从IBM的deveopworks的网页下载pvtrace,  并编译安装之,详见其说明。
  3.  gcc -g -finstrument-functions test.c  instrument.c -o test
  4. ./test
  5. pvtrace test
  6. dot -Tjpg graph.dot -o graph.jpg

例中test.c的代码为 

#include <stdio.h> int c(void){    int p;    p = 0;    return 0;}int b(void){    c();    c();    c();    printf("fd");    return 0;}int a(void){    int i = 0;    for(i=0; i < 200; i++){        b();     }    for(i=0; i < 1200; i++){        c();    }    return 0;}int main(){    a();    b();    c();    a();    c();    return 0;}
得到的结果如下

大功告成!

思考1

多个文件可以工作么?

于是增加tr.h 和tr.c 修改test.c 

tr.h 

int d(void);

tr.c

int d(void){    int t;    return 0;}
test.c

#include <stdio.h>#include "tr.h"int c(void){    int p;    p = 0;    return 0;}int b(void){    c();    c();    c();    printf("fd");    return 0;}int a(void){    int i = 0;    for(i=0; i < 200; i++){        b();        d();    }    for(i=0; i < 1200; i++){        c();    }    return 0;}int main(){    a();    b();    c();    a();    c();    return 0;}
重新编译执行,得到 下图,可见多个文件可以工作。

思考2

有心的读者,也许已经看出来了,在第一个例子中没有输出对库函数printf的调用。是不是就是这样的呢。特将tr.c 编译为动态库。

  1. gcc -shared tr.c -o libdzc.so
  2. gcc -g -ldzc -L. -finstrument-functions test.c instrument.c -o test
  3. export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
  4. 之后就是重复上述过程。得到与第一个例子相同的图。
这说明调用分析不对库函数进行分析,这正是我们所期望的。





原创粉丝点击