宏给dladdr()带来问题

时间:2010-04-08 15:40:36

标签: c profiling trace instrumentation

我使用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()

出现同样的问题

编辑:澄清一下:我正在寻找一种解决方案,以防止宏弄乱检测功能(他们不应该这样做)。不适用于跟踪宏,函数和/或其他事物的方法。

2 个答案:

答案 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,期望在标准输入上预处理输入