您好,登錄后才能下訂單哦!
在AIX中,xlc編譯器有個(gè)選項(xiàng)-qfunctrace,使用此選項(xiàng)編譯的程序,自動(dòng)會(huì)在每個(gè)函數(shù)的入口出口處調(diào)用以下自定義函數(shù)。
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ù)是通過(guò)throw異常拋出的,那么在異常被catch捕獲處,執(zhí)行__func_trace_catch(),但是遇到catch(...)捕獲不會(huì)執(zhí)行。值得注意的是,如果時(shí)throw拋出,不會(huì)觸發(fā)__func_trace_exit()。
使用這個(gè)功能,可以實(shí)現(xiàn)無(wú)需修改源程序,進(jìn)行性能統(tǒng)計(jì)的效果。程序如下。
tr.cpp為自定義函數(shù)出入口程序,每個(gè)函數(shù)執(zhí)行時(shí)都會(huì)經(jīng)過(guò)。編譯成為libfunctr.so。
tt.c為演示的例子程序。編譯成可執(zhí)行文件tt。
makefile為把tr.cpp編譯成so庫(kù),給tt.c連接使用(不修改tt.c任何代碼)。注意編譯tt.c時(shí)使用了-qfunctrace和-lC。
執(zhí)行后,效果如下:
$tt
1 20170429170216.354105 20170429170216.354151 46 27 19 main() : tt.c
2 20170429170216.354123 20170429170216.354137 14 6 8 f1() : tt.c
3 20170429170216.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
分別表示:函數(shù)的層次,開(kāi)始時(shí)間,結(jié)束時(shí)間,總耗時(shí)(包含嵌套調(diào)用),嵌套調(diào)用其他函數(shù)總耗時(shí),函數(shù)自身代碼耗時(shí),函數(shù)名和源文件名。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。