2013-05-29 1 views
-1

Я хотел бы добавить несколько модульных тестов в свой код, также как и загрузку подключаемых модулей. У меня не всегда есть доступ к коду, который я запускаю. Тест, который я бы хотел проверить , если функция, которую я вызываю, заблокирована?Как (единичный) тест, если функция заблокирована?

Есть ли какой-либо крючок или способ проверить, если между точкой A и B в моей программе был вызов функции без блокировки?

Еще одна сложная функция - как подключить все вызовы к функции блокировки (например, блокировки, системные вызовы ...). Я знаю, как перехватывать вызовы malloc на windows, но ничего больше.

Спасибо за вашу помощь

ответ

3

Вы не можете.

Вы можете заменить другую реализацию pthread_lock, но код может осуществлять прямые вызовы, например. futex, и если вы замените код, он все равно может вызвать его напрямую с помощью syscall(SYS_futex,...). Вы можете прокомментировать код или использовать что-то вроде strace, чтобы обнаружить все такие вызовы, но это все равно не скажет вам, реализует ли код собственную собственную спин-блокировку в сборке.

+0

как я уже сказал, у меня нет контроля над кодом функций, называемым грустно – dzada

+0

Точка моего ответа заключается в том, что это не сработает. –

+0

Да, это правда, извините. Дело в том, что я тоже работаю над macosx и окнами. Но получение всех системных вызовов, кроме тех, когда пользователь написал свой собственный механизм блокировки, не имеет большого значения. потому что это похоже на то, что он пишет занятое ожидание атома в основном, и я знаю, что не пойму. Я не ищу идеального решения, я ищу хороший способ слишком улавливать большую часть того, что могут сделать пользователи моего кода – dzada

3

Я уверен, что вы не можете сделать это без инструментированих замков, или что-то подобное.

Возможно, возникло множество сценариев, в которых вызов функции блокировки вызывает различное поведение при тестировании [возможно, только когда активирован «специальный тестовый режим для идентификации тестирования»], чем в производственном коде - например, добавьте спать в течение 100 мс в методе блокировки и попытаться использовать еще одну заблокированную функцию и сравнить время с «нет конкуренции за блокировку».

Или мы можем сохранить количество вызовов для блокировки и посмотреть, после того, как функция будет одинаковой (или увеличится на ожидаемую величину, если функция должна звонить lock определенное количество раз).

Но общий способ, который не является навязчивый механизм блокировки, я уверен, что это невозможно.

Конечно, обзор кода и четкая документация относительно того, какие блокировки кодов и которые не будут полезны, - и хорошие рецензенты, которые указывают ошибки.

+0

как я уже сказал, у меня нет контроля над кодом вызываемых функций, поэтому я не могу добавить сон или счетчик в функции, вызывающие блокировку. – dzada

+0

И я так понимаю, вы не можете обернуть функцию блокировки с помощью макроса? –

+0

Да, код может быть в dll, что статически связывает libc – dzada

0

Как уже сообщали другие, невозможно проверить, является ли алгоритм блокировкой или нет. Тем не менее, можно проверить, что он ведет себя последовательно в многопоточной среде. Мой опыт в этой области заключается только в использовании незакрепленной очереди (которую я написал сам, но на основе академической статьи), поэтому мои тесты основаны на очереди, которая может быть или не быть полезной для вас.

Я использовал несколько потоков для проверки, чтобы забить очередь.

  1. безопасность Темы: очередь не должна врезаться при больших нагрузках
  2. Скорости: а как время реакции изменяется под большой нагрузкой
  3. Последовательности: очередь не должны потерять детали.

В моем тесте я также различал количество читателей и писателей. Очередь будет вести себя по-разному в зависимости от отношения читателей к писателям.Больше читателей, чем писателей, обычно приводит к почти пустой очереди, тогда как обратное приведет к очереди, которая постоянно расширяется до тех пор, пока авторы не перестанут писать.

Вопрос 2 может вас заинтересовать, поскольку вы можете в целом определить, не является ли алгоритм блокировкой или нет, основываясь на дисперсии времени отклика при большой нагрузке. Если время ответа остается быстрым при большой нагрузке, вы можете сделать вывод о том, что алгоритм блокируется. Или, по крайней мере, если он не ведет себя так, как есть.