用 Graphviz 可视化函数调用

主要参考来自这里,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. 之后就是重复上述过程。得到与第一个例子相同的图。
这说明调用分析不对库函数进行分析,这正是我们所期望的。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值