winston 发表于 2012-2-11 19:30:19

Graphviz 可视化函数调用 - demo

参考:http://www.acejoy.com/thread-3788-1-1.html
主要操作
[*]安装graphviz,在fedora下yum install graphviz-devel。
[*]从IBM的deveopworks的网页下载pvtrace,并编译安装之,详见其说明。
[*] gcc -g -finstrument-functions test.cinstrument.c -o test
[*]./test
[*]pvtrace test
[*]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;
}
得到的结果如下
http://hi.csdn.net/attachment/201202/11/0_13289473927j2j.gif
大功告成!

思考1 多个文件可以工作么?
于是增加tr.h 和tr.c 修改test.ctr.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;

}
重新编译执行,得到 下图,可见多个文件可以工作。
http://hi.csdn.net/attachment/201202/11/0_13289479731jha.gif
思考2有心的读者,也许已经看出来了,在第一个例子中没有输出对库函数printf的调用。是不是就是这样的呢。特将tr.c 编译为动态库。

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





作者:chn89 发表于2012-2-11 16:18:28 原文链接




页: [1]
查看完整版本: Graphviz 可视化函数调用 - demo