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]