Была у меня тут история, прям классика жанра. Заказчик принес старый проект на поддержку, написанный, ну… как будто школьник клеил его из первых попавшихся кусков кода. Работал кое-как, но работал. А потом началось.
Появился странный баг. В общем, при определенных условиях, когда данные шли в определенном порядке, все валилось с ошибкой доступа к памяти. Звучит страшно, да? Начал искать. Смотрел логи, трассировал выполнение, ничего подозрительного.
Пробовал разные входные данные, менял порядок, убирал лишние операции. Где-то раз в двадцать пять попыток баг воспроизводился. Я уже начал думать что это какая-то аппаратная проблема, ну или просто случайность.
А потом, после трех дней почти непрерывного копания, я заметил одну деталь. В момент возникновения ошибки, один из временных файлов, который создавался и удалялся в процессе, не успевал удалиться. Оказывается, в очень редком случае, когда система была под максимальной нагрузкой, процесс удаления файла завершался раньше, чем сам процесс получения доступа к файлу. Простая гонка данных, но как же ее было сложно выявить!
Исправление заняло минут пятнадцать – добавил пару проверок и задержку. Но эта неделя… Вот тебе и общение с чужим кодом. Столько экспертизы пришлось применить, чтобы разобраться.
