Что такое гейзенбаг?

Гейзенбаг - ошибка в программе, которая перестает себя проявлять либо изменяет своё поведение при попытке её воспроизведения при отладке программы.

Иногда названия тех или иных вещей, придуманные с достаточной долей юмора, бывают настолько меткими и так удачно (и при этом коротко) характеризуют предметы или явления, что просто поражаешься, как такое вообще возможно. К чему я это говорю? К тому, что термин "гейзенбаг" как раз относится к таким названиям, которые предельно точно и с изрядной долей юмора характеризуют то, что ими названо.

Чтобы объяснить суть этого термина, придётся начать издалека. Думаю, все наши читатели в курсе, что в любых программах (кроме, разве что, самых элементарных) существуют ошибки - баги. Как правило, большая часть багов сравнительно просто устраняется при их выявлении, для чего существуют специальные программы - отладчики. Они дают программисту возможность исследовать поведение программы, позволяя остановить её в любой момент и узнать состояние всех её компонентов. Гейзенбаги не относятся к этому большинству - при попытке их воспроизвести при отладке программы они перестают себя проявлять. Иногда в русскоязычной литературе гейзенбаги называют "плавающими ошибками".

Не сложно увидеть, что термин "гейзенбаг" напрямую связан с фамилией "отца квантовой механики" Вернера Карла Гейзенберга. И даже, пожалуй, не столько с самим Гейзенбергом, сколько со знаменитым соотношением неопределённостей, носящим фамилию великого физика. Соотношение неопределённостей описывает очень интересный эффект микромира, когда измерения физических величин изменяют сами эти величины. По аналогии с этим и гейзенбаги, при попытке обнаружения их с помощью отладчика, изменяются либо вовсе перестают проявляться.

Почему возникают гейзенбаги и как с ними борются? Вопрос, на самом деле, очень непростой, поскольку гейзенбаги могут иметь самую что ни на есть разную природу, однако наиболее часто подобного рода ошибки возникают в многопоточных приложениях, где неверно выполнена синхронизация потоков. Дело в том, что переключение между потоками в многопоточный средах имеет случайных характер, а потому воспроизведение многих ошибок становится более чем затруднительным. К сожалению, универсальным и 100% работающим способом избавления от подобного рода ошибок является только переписывание исходного кода приложения "с нуля". Понятное дело, что этот способ довольно-таки радикален, а потому прибегают к нему в крайних случаях, когда гейзенбаг серьёзно угрожает работе программы, а все остальные методы борьбы с ним не привели к положительному результату.

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

03 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!