2014-02-07 24 views
0

如果线程与Pthread互斥锁/螺旋锁同步,则可以轻松地将调用打包为pthread_mutex_lock()pthread_mutex_unlock(),例如,使用LD_PRELOAD。这对记录/调试非常有用。我可以打包gcc的原子内建插件吗?

是否有可能与gcc的原子内置插件做类似的事情,例如__sync_fetch_and_add

我想我不会对我们LD_PRELOAD,但也许存在一些其他机制。

+0

内在函数直接转化为机器指令。它们不是库函数调用。 –

+0

是的,我知道这一点。但是也许gcc提供了一些编译标志或其他方法来包装这些函数。 – danyhow

+0

请注意'__sync'内置函数是'legacy'。考虑更近期的['__atomic'](http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins)内置函数。 –

回答

0

我认为这是可能的,使用英特尔的PIN(User Guide)等仪器API。例如,您可以通过检测执行原子更新的所有指令开始,并使用INS_IsAtomicUpdate进行原子更新,并添加进一步的排除标准以启发式地查找__sync_fetch_and_add生成的指令。

备选地,可以将每个__sync_fetch_and_add之前与asm volatile块安装一系列NOP的,专门用于该指令序列看起来,和仪器(对于__sync_fetch_and_add生成这势必成为代码)下面的机器代码。

+0

这是一个可能的解决方案,但需要始终在Pin之上运行应用程序。 (我喜欢NOP序列技巧。) – danyhow

+0

我很确定你不需要在你的应用程序中注入任何对PIN的依赖。我主要关心的是NOP块可能会损害性能,所以我只把它们放在调试版本中。 –

+0

是的,我看到与NOP相同的问题。我对Pin的关注是,如果你想在部署中获得调试信息,你需要将Pin与应用程序一起发布,以便在那里执行。所以我宁愿有一个gcc选项,允许我用应用程序编译包装器。除此之外,我喜欢这个解决方案。 – danyhow

相关问题