在AIX中,xlc編譯器有個選項-qfunctrace,使用此選項編譯的程序,自動會在每個函數(shù)的入口出口處調(diào)用以下自定義函數(shù)。

創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計、
成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)南丹,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
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);
在函數(shù)調(diào)用前,執(zhí)行__func_trace_enter(),函數(shù)正常返回后,執(zhí)行__func_trace_exit()。如果函數(shù)是通過throw異常拋出的,那么在異常被catch捕獲處,執(zhí)行__func_trace_catch(),但是遇到catch(...)捕獲不會執(zhí)行。值得注意的是,如果時throw拋出,不會觸發(fā)__func_trace_exit()。
使用這個功能,可以實現(xiàn)無需修改源程序,進(jìn)行性能統(tǒng)計的效果。程序如下。
tr.cpp為自定義函數(shù)出入口程序,每個函數(shù)執(zhí)行時都會經(jīng)過。編譯成為libfunctr.so。
#include
#include
#include
#include
using std::vector;
using std::string;
using std::clog;
using std::endl;
extern "C" void print_trace();
struct Stat
{
int lvl;
string name;
long stm;
long etm;
long oitv;
Stat(int l, const string& s, long st) : lvl(l), name(s), stm(st), etm(0), oitv(0) {}
};
static vector tracev;
static int clvl = 0;
extern "C" void
__func_trace_enter(const char * const proc_name,
const char * const file_name,
const int line_no,
void ** const id)
{
// printf("{ %s (%s:%d) %p %s\n", proc_name, file_name, line_no, id[0], (char*)*id);
struct timeval nowtm;
gettimeofday(&nowtm, NULL);
++clvl;
tracev.push_back(Stat(clvl, string(proc_name)+"() : "+file_name, nowtm.tv_sec * 1000000 + nowtm.tv_usec));
}
extern "C" void
__func_trace_exit(const char * const proc_name,
const char * const file_name,
const int line_no,
void ** const id)
{
// printf("} %s (%s:%d) %p %s\n", proc_name, file_name, line_no, id[0], (char*)*id);
struct timeval nowtm;
int itv;
gettimeofday(&nowtm, NULL);
auto iter = tracev.end() - 1;
while (iter->etm != 0)
--iter;
iter->etm = nowtm.tv_sec * 1000000 + nowtm.tv_usec;
itv = iter->etm - iter->stm - iter->oitv;
for (auto s = tracev.begin(); s!=tracev.end(); s++)
{
if (s->etm == 0)
s->oitv += itv;
}
--clvl;
if (clvl == 0)
print_trace();
}
extern "C" void print_trace()
{
time_t t;
char buf[30];
for (auto s = tracev.begin(); s!=tracev.end(); s++)
{
clog << s->lvl << "\t";
t=s->stm/1000000;
strftime(buf, sizeof(buf), "%Y%m%d%H%M%S", localtime(&t));
clog << buf << "." << s->stm % 1000000 << "\t";
t=s->etm/1000000;
strftime(buf, sizeof(buf), "%Y%m%d%H%M%S", localtime(&t));
clog << buf << "." << s->etm % 1000000 << "\t";
clog << s->etm-s->stm << "\t" << s->oitv << "\t" << s->etm-s->stm-s->oitv << "\t";
clog << string(s->lvl-1, ' ') << s->name << endl;
}
}
當(dāng)前文章:AIX下C/C++函數(shù)性能統(tǒng)計實現(xiàn)方法-創(chuàng)新互聯(lián)
標(biāo)題鏈接:
http://www.xueling.net.cn/article/dhhhsh.html