Про отладку

В коллекцию забавных происшествий при отладке программ добавилось ещё одно.


Из Java запускается C-препроцессор, результат работы которого подается на вход нашей программе. Программа благополучно падает. Ставлю в Eclipse точку останова на запуск препроцессора, запускаю в отладочном режиме — всё работает. Запускаю в боевом режиме — опять падает.

Конечно, дело в том, что Runtime.exec(…) не ждет, пока запущенный процесс закончится. Без точки останова препроцессор не успевал отработать и наша программа банально не находила входных данных.

Попутно выяснилось вот ещё что: если запущенная программа что-нибудь активно пишет на стандартные потоки вывода или ошибок, то данные из них необходимо читать. В противном случае выполнение приостанавливается. По крайней мере на Windows так происходит. С этим я раньше как-то не сталкивался.

А вот что я писал по этому поводу больше трех лет назад:

Коллега пожаловался на мистическое изменение значения переменной в программе на C#. Смотрим, при отладке в MS Visual Studio .NET 2003: значение устанавливается, метод заканчивается, а в объемлющем методе значение уже другое. Шайтан да и только. Я чуть ли не компилятор начал подозревать, а дело было в хитром свойстве (property), значение которого выводилось в окне watch — кроме возвращения значения переменной property обнуляло эту переменную. Автор сказал — на всякий случай…

Обнаружилось странное поведение нашего Add-In’a для этой самой MS Visual Studio .NET 2003 — файлы в проект нашего типа добавляться перестали. Вроде всё работало и ничего не меняли. Потом оказалось, что иногда они всё-таки добавляются — после того, как запускалась сборка проекта. И в окне output, которое появляется после сборки, видна отладочная печать из кода, добавляющего файл. После изучения выяснилось, что проблема как раз в той самой отладочной печати — если окно output ещё не создано, вывод невозможен, возникает исключение, которое внешне никак не проявляется. Но и не работает ничего.

03.07.2007  Метки: , ,   Рубрики: Разработка

Написать комментарий