如果线程与Pthread互斥锁/螺旋锁同步,则可以轻松地将调用打包为pthread_mutex_lock()
和pthread_mutex_unlock()
,例如,使用LD_PRELOAD
。这对记录/调试非常有用。我可以打包gcc的原子内建插件吗?
是否有可能与gcc的原子内置插件做类似的事情,例如__sync_fetch_and_add
?
我想我不会对我们LD_PRELOAD
,但也许存在一些其他机制。
如果线程与Pthread互斥锁/螺旋锁同步,则可以轻松地将调用打包为pthread_mutex_lock()
和pthread_mutex_unlock()
,例如,使用LD_PRELOAD
。这对记录/调试非常有用。我可以打包gcc的原子内建插件吗?
是否有可能与gcc的原子内置插件做类似的事情,例如__sync_fetch_and_add
?
我想我不会对我们LD_PRELOAD
,但也许存在一些其他机制。
我认为这是可能的,使用英特尔的PIN(User Guide)等仪器API。例如,您可以通过检测执行原子更新的所有指令开始,并使用INS_IsAtomicUpdate
进行原子更新,并添加进一步的排除标准以启发式地查找__sync_fetch_and_add
生成的指令。
备选地,可以将每个__sync_fetch_and_add
之前与asm volatile
块安装一系列NOP的,专门用于该指令序列看起来,和仪器(对于__sync_fetch_and_add
生成这势必成为代码)下面的机器代码。
内在函数直接转化为机器指令。它们不是库函数调用。 –
是的,我知道这一点。但是也许gcc提供了一些编译标志或其他方法来包装这些函数。 – danyhow
请注意'__sync'内置函数是'legacy'。考虑更近期的['__atomic'](http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins)内置函数。 –