Інструменти:
• rr — записує виконання програми один раз (включно з timing, потоками, всім). Потім можеш "перемотувати" назад і вперед скільки хочеш. Баг більше не втече.
• ThreadSanitizer (TSan) — додаєш прапорець
-fsanitize=thread при компіляції, і він слідкує за всіма зверненнями до пам'яті. Якщо два потоки лізуть в одне місце без синхронізації — покаже.• CHESS (Microsoft) — систематично перебирає всі можливі порядки виконання потоків. Не чекає, поки баг "випадково" вилізе — шукає сам.Факт: CHESS відтворив за 30 секунд баг, що з'являвся раз на місяць.
———
Головне
Немає "правди" про програму. Є правда відносно того, як дивишся.
Це не баг у звичному сенсі. Це природа складних систем.
Не питай "де баг?" Питай: "при яких умовах система поводиться так, а при яких — інакше?"
У цьому питанні вже половина відповіді.
———
Наступного разу, коли баг зникне під debugger'ом — посміхнись. Ти щойно побачив квантову механіку в дії.
Heisenbug передає привіт.