После подключения бесперебойника программа больше не работает

Я сижу и спокойно программирую. Ко мне подходит коллега-физик из соседней комнаты. При этом у него странное выражение лица и подозрительная нездоровая улыбка. Он делает серьезное лицо и заявляет: «Мне наша замечательная программа „ABCD“ предлагает обратиться к разработчику, и вот, я здесь». В общем, мне всё сразу понятно. Если программа падает, то она выдаёт сообщение в духе «Просим связаться с разработчиком». Поскольку одним из разработчиков «ABCD» являлся я, то он и пришёл по мою душу. Но откуда эта странная улыбка, и почему не просто баг в багтрекере… Впрочем, я особенно не задумываюсь на эту тему и иду с ним.
Картина классическая. Программа с окошком о падении. Эка невидаль. Только не подумайте, что программа падает каждые 5 минут. Но сильно удивляться такой ситуации тоже смысл нет. Спрашиваю — «Что делал?».
Он расплывается в улыбке и между нами происходит следующий диалог:
— Я новый ИБП (блок бесперебойного питания подключил). Теперь больше программа не запускается. Сразу после запуска падает.
— Гм. А что ещё делал?
— Ничего.
— Ха-ха. Ну да, конечно… До подключения ИБП значит работала, а после нет.
Коллега расплывается в ещё больше улыбке: «Именно! Гляди, сейчас буду показывать фокус».
Он выключает компьютер. Лезет за стол. Ковыряется там. Меняет кабель идущий от ИБП на провод идущий просто от розетки. Включает компьютер. Запускает нашу программу. Она успешно работает.
Выключает компьютер. Вновь лезет под стол. Подключает провод от ИБП. Включает компьютер. Улыбаясь дальше некуда, запускает программу. Программа падает сразу после старта!
Это был шок. Пожалуй я никогда не находился в таком замешательстве, работая с вычислительной техникой.
Конечно, потом всё прояснилось. Про это будет ниже. И причина такого поведения покажется банальной.
Однако именно в тот момент, я засомневался, что понимаю принципы работы компьютера и базовых физических законов. Шутка, про искривления бит в проводе, в тот момент казалась мне не такой уж и шуткой.
Пожалуй, это было одно из самых сильных впечатлений, которые я получил от компьютера. Даже не знаю с чем сравнить. Близкие чувства я испытал, когда экспериментируя с Апогей БК01 открыл, что им можно управлять, просто поднося руку. Достаточно читать и обрабатывать шум из неподключенных ни к чему портов ввода вывода (как правильно их называть не помню).
Не знаю, смог ли я сейчас словами передать свои чувства. Попробуйте представить, когда программа, которую ты неплохо знаешь, работает от сети и не работает через ИБП.
А оказалось всё просто. Это не было волшебным пониженным питанием от бракованного ИБП. Это были не искривлённые биты.
Причиной магии и моего удивления было некачественно программное обеспечение. Да ещё коллега был бякой, который вначале скрыл от меня одну важную деталь, не придав ей значения.
К компьютеру не только был подключен ИБП. Вместе с ним шел диск с программным обеспечением и USB-проводок для подключения этого бесперебойника к компьютеру. Программа на диске позволяла делать всякое разное. Например, можно было щелкнуть на её иконку в Systray и посмотреть заряд аккумулятора. Важно, что эту программу он тоже установил. Просто так.
А последствия оказались фатальными. Эта чудо-программка, болтающаяся в Systray отправляла в нокаут не только нашу программу, но как выяснилось чуть позднее и многие другие приложения. Как она умудрялось это делать? Ха, говнокодеры способны и не на такое!
Изыскания причины поломки выявили, что перестала работать подсистема OpenGL. Но неужели наша программа так особенно использует OpenGL? Нет. Сломались и другие OpenGL программы. Например, перестал работать Quake. Или другая какая-то «стрелялка». Не помню уже. Да, да, иногда после работы мы убивали друг друга в виртуальном мире. Студенты.
Эта Г-программка для ИБП, для того чтобы нарисовать красивую круглую диаграмму о проценте заряда, зачем-то использовала OpenGL. Причем делала эта бесцеремонно. После запуска, она сразу сжирала все OpenGL ресурсы. В результате, OpenGL использовала только эта программа мониторинга, оставив другим кукиш. И не важно, смотрел ты на её красивую картинку или нет. Все ресурсы были уже исчерпаны. Что именно она делала, забылось за давностью лет. А общий смысл таков. Она бесконечно создавала какие-то OpenGL объекты и не освобождала их. Моментально, такие объекты кончались, но программе было всё равно. Сама она работала нормально. Но другие программы уже не могли создать ни одного такого объекта. Вместо дескрипторов они получали статус ошибки.
Если ИБП выключить, но оставляли USB проводок и программу, то ошибка исчезала. Наверное, программа видела, что бесперебойника нет и работала как-то иначе. Именно это и демонстрировал мне мой коллега, колебля моё ощущение реальности мира.
Результатом стала более точная диагностика таких ошибок в нашей программе и отказ от «чуда-юда» для визуализации состояния ИБП.
Вот такое программное обеспечение, порой поставляется в придачу к устройству.