主要参考来自这里,http://www.ibm.com/developerworks/cn/linux/l-graphvis/
主要操作
- 安装graphviz,在fedora下yum install graphviz-devel。
- 从IBM的deveopworks的网页下载pvtrace, 并编译安装之,详见其说明。
- gcc -g -finstrument-functions test.c instrument.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;
}
得到的结果如下
大功告成!
思考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 编译为动态库。
- 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
- 之后就是重复上述过程。得到与第一个例子相同的图。