我已經實現了使用gcc的-finstrument-functions
選擇跟蹤行爲,這(簡化)代碼:宏給人以提供dladdr問題()
void __cyg_profile_func_enter(void *this_fn, void *call_site)
{
Dl_info di;
if(dladdr(this_fn, &di))
printf("entered %s\n", (di.dli_sname?di_dli_sname:"<unknown>"));
}
這個偉大的工程,除了一兩件事:宏的處理爲好,但該功能打印出包含宏的功能的信息。
因此,包含宏的函數將其信息打印多次(這當然是不希望的)。
有什麼可以檢測到宏正在處理?或者可以根本關閉儀表宏?與sizeof()
編輯發生
PS同樣的問題:澄清:我在尋找一個解決方案,以防止宏與儀表功能(他們不應該這樣做)搞亂。不適用於跟蹤宏,函數和/或其他事物的方法。
期待預處理後的輸入,但爲什麼會出現由於宏調用'__cyg_profile_func_enter'當它們被擴大預處理器?!當應用程序正在編譯時,它們應該消失,但它看起來好像沒有消失,並且作爲一個函數行事...... – Veger 2010-04-08 17:25:48
@Vegar:你能舉出一個這樣的宏的例子嗎? – Hasturkun 2010-04-08 23:14:18
'#define CLEAR_REQ(reqp)memset((reqp),0,sizeof(struct raw1394_request))'例如。 – Veger 2010-04-09 07:38:19