我使用gcc的-finstrument-functions
选项和此(简化)代码实现了跟踪行为:
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>"));
}
这很好,除了一件事:宏也被处理,但该函数打印包含宏的函数的信息。
因此,包含宏的函数会多次打印信息(这当然是不受欢迎的)。
是否有任何东西可以检测到正在处理宏?或者可以完全关闭仪器宏?
PS sizeof()
编辑:澄清一下:我正在寻找一种解决方案,以防止宏弄乱检测功能(他们不应该这样做)。不适用于跟踪宏,函数和/或其他事物的方法。
答案 0 :(得分:1)
宏由预处理器内联展开,因此无法区分直接从代码调用的函数和从宏调用的函数。
唯一可行的方法是让您的宏设置一个全局标志,您的跟踪功能将检查该标志。 这当然不是万无一失,因为从宏调用的函数所做的任何调用也会以相同的方式出现。
答案 1 :(得分:1)
如果您真的想深入了解,我可以看到我对breakdown c++ code size的回复。 C ++模板实际上只是更正式的宏,所以这可能适合你。
也可能没有,因为宏中的 LINE 和 FILE 对应于来电者。
编辑 从我对此的评论:
$ gcc -E foo.c | gcc -x c-cpp-output -c -finstrument-functions - -o foo.o
预处理传输到gcc,期望在标准输入上预处理输入