c - dladdr() 出现问题的宏

标签 c profiling trace instrumentation

我已经使用 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/

相关文章:

c++ - 关于代码的一些优化(计算 vector 的排名)?

clojure - clojure 中 FizzBu​​zz 的两种解决方案中,为什么其中一种更快?

c - OProfile 警告 'dropping hyperspace sample' 是什么意思?

delphi - 有没有办法在Delphi中仅跟踪项目源?

azure - 在 Azure Web App 中进行跟踪 - 日志文件/应用程序中没有记录任何内容

c - 使用 getopt 获取 optarg

c - 尝试编写用于查找机器 epsilon 的代码

c - 流程的完整状态

c++ - 快速而肮脏的方式来分析你的代码

python - 调试:如何检查我的 Python 程序卡在哪里?