Что такое Heisenbug в программировании?

«Что такое Heisenbug в программировании?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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}')

Стратегии отладки:

  1. Логирование вместо интерактивного дебаггера.
  2. Детерминированное воспроизведение: Использование фиксированных сидов для генераторов случайных чисел.
  3. Стресс-тестирование: Увеличение нагрузки для повышения вероятности проявления.
  4. Специализированные инструменты: Санитайзеры адресов и потоков (ASan, TSan).