#2: Хейзенбаг

🚀 Хейзенбаг (heisenbug) — это тип ошибки, которая исчезает или меняет поведение при отладке.

Название происходит от принципа неопределённости Гейзенберга, утверждающего, что сам процесс измерения может повлиять на измеряемый объект.

Хейзенбаги возникают в распределённых системах, многопоточных программах, бывают связаны с отказами железа, средой (prod, staging) или временем выполнения кода.

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

📚 Пример хейзенбага:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <pthread.h>

int c = 0;

void* inc(void* arg) {
  for (int i = 0; i < 1000; ++i) c++;
}

int main() {
  pthread_t t1, t2;

  pthread_create(&t1, NULL, inc, NULL);
  pthread_create(&t2, NULL, inc, NULL);

  pthread_join(t1, NULL);
  pthread_join(t2, NULL);

  printf("%d\n", c);
}

Из-за отсутствия синхронизации между потоками значение счётчика будет отличаться от запуска к запуску.

🔗 Хейзенбаг на Вики

🔗 Пост в канале

Привет, я Олег Громов 🤘

Я разработчик и автор, иногда что-то запускаю. Тут я много умничаю пишу о разработке и индустрии, сайд-проектах и стартапах, жизни и прочих штуках.

Прямо сейчас я занят тем, что собираю все старые блоги на этом сайте.

А ещё у меня есть телеграм-канал. Рад, что вы заглянули!