Как вы отлаживаете ошибку, которая появляется только при большой нагрузке?

В настоящее время мы разрабатываем программное обеспечение диспетчера кластеров на C. Если несколько узлов подключаются к диспетчеру, он работает отлично, но если мы будем использовать некоторые инструменты для имитации 1000 узлов для подключения менеджера, это иногда будет работать неожиданным образом.

Как можно отладить эту ошибку? Он появляется только при большой нагрузке (соединение/узлы)?

Если я использую gdb для отладки шаг за шагом, приложение никогда не срабатывает.

Ответ 1

Как отладить эту ошибку?

В общем, вы хотите использовать по крайней мере эти методы:

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

там также нет предупреждения в проверке valgrind.

Непонятно, просто ли вы запускали целевое приложение под Valgrind, или у вас также есть модульные тесты, а тесты - Valgrind-clean. Также неясно, наблюдали ли вы неправильное поведение приложения в Valgrind или нет.

Valgrind был лучшим инструментом для кучи и неинтеллизированной памяти, но в 2017 году это уже не так.

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

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

Наконец, есть такие инструменты, как трассировка GDB и systemtap - их труднее изучить, но дать вам значительную силу. Обзор здесь.

Ответ 2

К сожалению, отладчик менее полезен для отладки concurrency/проблем с загрузкой.

Продолжайте добавлять журналы /printfs, запускать проблему с нагрузочным тестированием, а затем попытаться сузить ее с помощью большего количества журналов /printfs. Повторить.

Чем быстрее будет запускать ошибку, тем быстрее она будет сходиться. Также предпочитайте классический метод "bisection" / "двоичный поиск" при добавлении журналов - попытайтесь сузить области, на которые вы смотрите, по крайней мере, половину каждый раз.