C 给出dladdr()问题的宏

C 给出dladdr()问题的宏,c,profiling,trace,instrumentation,C,Profiling,Trace,Instrumentation,我已经使用gcc的-finstrument functions选项实现了跟踪行为,并且该(简化)代码: void\uuuu cyg\u profile\u func\u enter(void*本站,void*调用站) { Dl_信息di; 如果(dladdr(本文件和di)) printf(“输入%s\n”,(di.dli\u sname?di\u dli\u sname:); } 这非常有效,除了一件事:宏也会被处理,但函数会打印包含宏的函数的信息 因此,包含宏的函数将其信息打印多次(这当然

我已经使用gcc的
-finstrument functions
选项实现了跟踪行为,并且该(简化)代码:

void\uuuu cyg\u profile\u func\u enter(void*本站,void*调用站)
{
Dl_信息di;
如果(dladdr(本文件和di))
printf(“输入%s\n”,(di.dli\u sname?di\u dli\u sname:);
}
这非常有效,除了一件事:宏也会被处理,但函数会打印包含宏的函数的信息

因此,包含宏的函数将其信息打印多次(这当然是不希望的)

是否有任何东西可以检测到正在处理宏?或者可以完全关闭检测宏吗

PS同样的问题也会出现在
sizeof()上


编辑:澄清一下:我正在寻找一种解决方案,以防止宏弄乱插入指令的函数(它们不应该这样做)。不适用于跟踪宏、函数和/或其他内容的方法。

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

唯一可行的方法是让宏设置一个全局标志,跟踪函数将对此进行检查。
这当然不是万无一失的,因为从宏调用的函数所执行的任何调用也会以相同的方式出现。

如果您真的想深入研究它,您可以看到我对它的响应。C++模板实际上只是更正式的宏,所以这对你可能有用。 它也可能不是,因为宏中的文件对应于调用方

编辑 从我的评论来看:

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

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

,但为什么在预处理程序展开宏时,我会收到对
\uuuu cyg\u profile\u func\u enter
的调用?!当应用程序被编译时,它们应该消失了,但看起来它们并没有消失,而是作为一个函数运行…@Vegar:你能举一个这样一个宏的例子吗?
#define CLEAR_REQ(reqp)memset((reqp),0,sizeof(struct raw1394_request))
例如,我正在调试/跟踪一个包含这些宏的现有库,我不明白为什么它们在
\uuuuu cyg\u profile\u func\u enter中给出点击率。为什么这些点击与宏所使用的函数相同?我需要什么(gcc标志?在
\uuu cyg\u profile\u func\u enter
函数中进行一些检测)来防止它们(在不完全修改库的情况下)。尝试将预处理器和编译阶段分离出来。预处理不带-finstrument functions标志的源文件,然后使用它编译预处理文件。$gcc-efoo.c | gcc-xc-c-finstrument函数--o foo.oI一直在尝试这个,但我似乎没有让它工作。库正在使用libtool构建,我无法正确修改libtool调用以单独预处理文件。但是谢谢你的主意!
$ gcc -E foo.c | gcc -x c-cpp-output -c -finstrument-functions - -o foo.o