AIX下C/C++函数性能统计实现方法


在AIX中,xlc编译器有个选项-qfunctrace,使用此选项编译的程序,自动会在每个函数的入口出口处调用以下自定义函数。

extern “C” void
__func_trace_enter(const char * const proc_name,
const char * const file_name,
const int line_no,
void ** const id);

extern “C” void
__func_trace_exit(const char * const proc_name,
const char * const file_name,
const int line_no,
void ** const id);

extern “C” void
__func_trace_catch(const char * const proc_name,
const char * const file_name,
const int line_no,
void ** const id);

在函数调用前,执行__func_trace_enter(),函数正常返回后,执行__func_trace_exit()。如果函数是通过throw异常抛出的,那么在异常被catch捕获处,执行__func_trace_catch(),但是遇到catch(…)捕获不会执行。值得注意的是,如果时throw抛出,不会触发__func_trace_exit()。

使用这个功能,可以实现无需修改源程序,进行性能统计的效果。程序如下。

tr.cpp为自定义函数出入口程序,每个函数执行时都会经过。编译成为libfunctr.so。

tt.c为演示的例子程序。编译成可执行文件tt。

makefile为把tr.cpp编译成so库,给tt.c连接使用(不修改tt.c任何代码)。注意编译tt.c时使用了-qfunctrace和-lC。

执行后,效果如下:
$tt
1 20170429170216.354105 20170429170216.354151 46 27 19 main() : tt.c
2 20170429170216.354123 20170429170216.354137 14 6 8 f1() : tt.c
3 20170开发云主机域名429170216.354130 20170429170216.354136 6 0 6 f2() : tt.c
2 20170429170216.354138 20170429170216.354151 13 6 7 f1() : tt.c
3 20170429170216.354144 20170429170216.354150 6 0 6 f2() : tt.c

分别表示:函数的层次,开始时间,结束时间,总耗时(包含嵌套调用),嵌套调用其他函数总耗时,函数自身代码耗时,函数名和源文件名。

相关推荐: 浅谈路由概念

计算机网络的五层因特网协议栈由上而下分别是:应用层,运输层,网络层,链路层和物理层,路由概念就出现在网络层中,因为网络层的三个重要功能为:转发、路由选择、建立连接。这篇文章主要分析一下有关路由的概念。 首先区分一下转发和路由选择的区别: 转发是指将分组从一个输…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/31 11:42
下一篇 03/31 11:42