понедельник, 25 октября 2010 г.

[prog.flame] И за это я тоже не люблю С++

Несколько раз за мою бытность C++ником происходили случаи, когда мои C++ные программы падали, а я не мог объяснить причины этого. Причем всегда это было связано с Visual C++ компиляторами. Вспоминаются следующие случаи.

В первый раз это было где-то в 1998-м, когда я под VC++ 4.2 тестировал свою собственную объектную СУБД. Сервер БД падал, когда к нему несколько раз подключались, активно работали, а потом отключались клиенты. Падал в достаточно произвольные моменты. В принципе, я смог выстроить цепочку действий, которая гарантировано ломала сервер, но произойти это могло как через 5 минут, так и через 15 минут работы.

Долго я тогда искал причины проблемы, наверное дня три сидел за машиной с утра до вечера. И ничего не мог найти, да и тот же самый сервер под OS/2 работал вообще без проблем. В результате все закончилось тем, что в одном из мест программы я заменил один свой самописный контейнер на другой – программа падать перестала.

Второй раз дело было году в 2003. Поставили мы тогда написанную под заказ систему на четырехпроцессорную машину заказчика. А она стала периодически зависать. Опять же в произвольные моменты времени, но в итоге зависала.

Пользовались мы тогда VC++ 6.0. Пару дней я убил чтобы проблему найти, благо машина заказчика тогда у нас стояла. Ничего не нашел. Просто перекомпилировал приложение VC++ 7.1 – зависать перестало. И под MinGW так же не зависало. Такой эффект только под VC++ 6.0 проявлялся.

С VC++ 9.0 (это который из VS2008) недавно прикол был. Компилирую маленькую утилитку, в которой библиотека TCLAP используется. Запускаю без аргументов (чтобы выдачу справки спровоцировать) из FAR-а или Cygwin-овского bash-а – падает. Если тоже самое из cmd.exe – не падает. На машине разработчика вообще не падает. Пытаешься отлаживаться – отладчик ничего путного не говорит. Перешли на новую версию TCLAP, таких приколов больше не наблюдается. Если же компилироваться VC++ 7.1, то вообще никогда не падает.

А вот последний случай произошел на прошлой неделе. Потребовалось доработать приложение, которое некоторое время назад было переведено с VC++ 7.1 на VC++ 9.0. Доработал. Стало эпизодически падать.

В Release режиме падает. В Debug нет. Если скомпилировать в Release с PDB, то падает. Но студийный отладчик не может показать нормального stack trace. Т.е. даже вообще ничего не показывает, из какого места нашего кода мы оказались в MS-овской DLL-ке – фиг его знает. Как искать причину, ведь явно место сбоя – это уже последствия какой-то наведенной ошибки, а где ее причина… Ничего не понять.

Опыт подсказывает, что вероятность моей собственной ошибки гораздо больше, чем ошибки где-то в компиляторе. Но опыта не хватает, чтобы проблему выявить. Проект-то очень не маленький, плюс сторонних библиотек в нем достаточно (одни только ACE с POCO и OTL чего стоят). Тем более, что под VC++ 7.1 все работает как часы. И так хочется верить, что это глючит оптимизатор в проклятой мастдаевской мелкомягкой поделке! :)))

Блин, не люблю я C++ за такие вещи. Убиваешь время на пустом месте. Жалко, что я в свое время поиск замены C++ так и не закончил. Хочется временами чего-нибудь железобетонного, чтобы не то что ногу отстрелить, чтобы даже прицелиться в нее нельзя было :)))

Отправить комментарий