宏给人的问题提供dladdr()

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

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出现同样的问题()

编辑:为了澄清:我在寻找一个解决方案,以防止宏与仪表功能(他们不应该这样做)搞乱。 不为方法跟踪宏,功能和/或其他东西。

--------------解决方案-------------

宏由预处理器内联展开,因此没有办法一个直接从代码调用和从宏调用的函数之间进行区分。

解决这个问题的唯一可行的办法是让你的宏设置一个全球性的标志,它的跟踪功能将检查。 这是比万无一失当然少,因为由一个从宏调用的函数完成的任何呼叫也会出现同样的方式。

如果你真的想钻研它,你可以看到我的反应击穿C ++代码的大小。 C ++模板实际上只是更正式的宏,所以这可能为你工作。

它也可能不是,因为宏对应于呼叫者在LINE和 文件

从我对此有何评论编辑:

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

预处理管道输送到海湾合作委员会期待预处理后的输入标准输入

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.395 (s). 10 q(s)