您好,登錄后才能下訂單哦!
在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 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
分別表示:函數的層次,開始時間,結束時間,總耗時(包含嵌套調用),嵌套調用其他函數總耗時,函數自身代碼耗時,函數名和源文件名。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。