Ответ
Heisenbug — это неустойчивая ошибка, которая изменяет своё поведение или исчезает при попытке её наблюдения или отладки. Название отсылает к принципу неопределённости Гейзенберга в квантовой физике.
Основные причины:
- Гонки данных (Race Conditions): Время выполнения влияет на результат.
- Побочные эффекты отладки: Добавление логов или точек останова меняет временные характеристики, маскируя проблему.
- Неинициализированная память: Поведение может меняться в зависимости от «мусора» в памяти.
Пример (гонка данных в Python):
import threading
counter = 0
def increment():
global counter
for _ in range(100000):
counter += 1 # Неатомарная операция
threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
# Результат каждый раз разный и меньше 1 000 000
print(f'Result: {counter}')
Стратегии отладки:
- Логирование вместо интерактивного дебаггера.
- Детерминированное воспроизведение: Использование фиксированных сидов для генераторов случайных чисел.
- Стресс-тестирование: Увеличение нагрузки для повышения вероятности проявления.
- Специализированные инструменты: Санитайзеры адресов и потоков (ASan, TSan).