0

我已经使用-finstrument-functionsgcc 的选项和这个(简化的)代码实现了跟踪行为:

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()

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

4

2 回答 2

1

宏由预处理器内联扩展,因此无法区分直接从代码调用的函数和从宏调用的函数。

解决此问题的唯一可能方法是让您的宏设置一个全局标志,您的跟踪函数将检查该标志。这当然不是万无一失的,因为从宏调用的函数所做的任何调用也将以相同的方式出现。

于 2010-04-08T15:56:21.360 回答
1

如果您真的想深入研究,可以查看我对故障 c++ 代码大小的回复。C++ 模板实际上只是更正式的宏,所以这可能对您有用。

它也可能不是,因为宏中的LINEFILE对应于调用者。

根据我对此的评论进行编辑:

$ gcc -E foo.c | gcc -x c-cpp-output -c -finstrument-functions - -o foo.o

预处理通过管道传输到 gcc,期望标准输入上的预处理输入

于 2010-04-08T16:03:05.290 回答