2014-02-07 3 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' являются« устаревшими ». Рассмотрим более поздние ['__atomic'] (http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins) встроенные функции. –

ответ

0

Я мог бы подумать, что это возможно, используя API-интерфейс для инструментов, такой как PIN-код Intel (User Guide). Например, вы можете начать с применения всех инструкций, которые выполняют атомарные обновления с помощью INS_IsAtomicUpdate, и добавить дополнительные критерии исключения для эвристического определения инструкций, генерируемых __sync_fetch_and_add.

В качестве альтернативы, вы можете установить ряд НОП с asm volatile блоком перед каждым __sync_fetch_and_add, смотрите специально для этой последовательности команд, и инструмент машинный код, который следует (что обязательно будет код, сгенерированный для __sync_fetch_and_add).

+0

Это возможное решение, но нужно всегда запускать приложение поверх Pin. (Мне нравится трюк последовательности NOP.) – danyhow

+0

Я уверен, что вам не нужно вводить какие-либо зависимости PIN-кода в приложение. Моя основная забота заключается в том, что блоки NOP могут повредить производительность, поэтому я бы включил их только в отладочные сборки. –

+0

Да, я вижу ту же проблему с NOP. Моя забота о Pin заключается в том, что если вы хотите иметь отладочную информацию в развертывании, вам нужно будет отправить Pin с приложением, чтобы он выполнялся там. Поэтому я предпочел бы иметь параметр gcc, который позволяет мне скомпилировать обертку с приложением. Иначе, чем мне нравится решение. – danyhow

Смежные вопросы