给 dladdr() 带来问题的宏
Posted
技术标签:
【中文标题】给 dladdr() 带来问题的宏【英文标题】:Macros giving problems with dladdr() 【发布时间】:2010-04-08 15:40:35 【问题描述】:我已经使用 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>"));
这很好用,除了一件事:宏也会被处理,但函数会打印包含宏的函数的信息。
因此,包含宏的函数会多次打印其信息(这当然是不希望的)。
有什么东西可以检测到正在处理宏吗?或者是否可以完全关闭检测宏?
PSsizeof()
也会出现同样的问题
编辑:澄清:我正在寻找一种解决方案来防止宏与检测功能混淆(他们不应该这样做)。不适用于跟踪宏、函数和/或其他事物的方法。
【问题讨论】:
【参考方案1】:宏由预处理器内联扩展,因此无法区分直接从代码调用的函数和从宏调用的函数。
解决此问题的唯一可能方法是让您的宏设置一个全局标志,您的跟踪函数将检查该标志。 这当然不是万无一失的,因为从宏调用的函数所做的任何调用也将以相同的方式出现。
【讨论】:
但是为什么当预处理器扩展宏时我会调用__cyg_profile_func_enter
?!在编译应用程序时它们应该消失了,但看起来它们并没有消失并且表现为函数......
@Vegar:你能举一个这样的宏的例子吗?
#define CLEAR_REQ(reqp) memset((reqp), 0, sizeof(struct raw1394_request))
例如。【参考方案2】:
如果您真的想深入了解它,可以查看我对breakdown c++ code size 的回复。 C++ 模板实际上只是更正式的宏,所以这可能对你有用。
也可能不是,因为宏中的 LINE 和 FILE 对应于调用者。
编辑 根据我对此的评论:
$ gcc -E foo.c | gcc -x c-cpp-output -c -finstrument-functions - -o foo.o
预处理通过管道传输到 gcc,期望在标准输入上进行预处理
【讨论】:
我正在调试/跟踪一个包含这些宏的现有库,我很困惑他们为什么会在__cyg_profile_func_enter
上点击。为什么这些命中与使用宏的功能相同?我需要什么(gcc 标志?__cyg_profile_func_enter
函数中的一些检测)来防止它们(不完全修改库)。
尝试分离构建的预处理器和编译阶段。预处理没有 -finstrument-functions 标志的源文件,然后用它编译预处理文件。 $ gcc -E foo.c | gcc -x c -c -finstrument-functions - -o foo.o
我一直在尝试这个,但我似乎没有得到这个工作。该库正在使用 libtool 构建,我无法正确修改 libtool 调用以单独预处理文件。但是感谢您的想法!以上是关于给 dladdr() 带来问题的宏的主要内容,如果未能解决你的问题,请参考以下文章