我已经使用 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()
也会出现同样的问题
编辑:澄清一下:我正在寻找一种解决方案来防止宏与检测函数混淆(它们不应该这样做)。不适用于跟踪宏、函数和/或其他事物的方法。
最佳答案
宏由预处理器内联扩展,因此无法区分直接从代码调用的函数和从宏调用的函数。
解决这个问题的唯一可能的方法是让您的宏设置一个全局标志,您的跟踪函数将检查该标志。 这当然不是万无一失的,因为从宏调用的函数完成的任何调用也将以相同的方式出现。
关于c - dladdr() 出现问题的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2601274/