Решил выделить обсуждение здесь:
http://itland.ru/forum//index.php?showtopic=20915&pid=103412&st=0 в отдельную тему.
Цитата:Нужен живой пример, сам понимаешь smile.gif
Сможешь какой-то тест предоставить или описать ситуацию, в которой баг повторяется ?
Хитрый... Легкой жизни хочешь
Нет теста, в котором ситуация повторяется. Просто система работает нестабильно. Добавляешь в обработку пару фрагментов: начинает вылетать по AV. Меняешь иногда местами пару строк - начинает работать. Работающий вроде вариант ВДРУГ перестает работать и начинает вылетать. Как было: утром запустил (ничего не меняя) вечерний вариант - постоянные AV.
Описываю ситуацию. Нужно было перенести данные из старой Комплексной в ЗиК (сотрудники, расчеты, кадровые данные и т.п.) Обе базы - ДБФ. Как любитель ДБФ решил было пойти старым путем: выгрузка в ДБФ/загрузка из ДБФ. Но тут вспомнил про новый функционал в 2.5, позволяющий делать запросы к посторонней базе. (ПрисоединитьМД, все дела...) Тогда мне, фактически, надо писать только одну загрузку, что дает существенную экономию кода. Начал писать.
Первые грабли: ругается на что-то там про многошаговую операцию OLE DB. Глянул сырцы: не выполняется проверка на наличие конечного слеша в пути. Добавил слеш к пути - заработало.
Вторые грабли. Нестабильные вылеты. Вылетает всегда на ВыполнитьИнструкцию. Иногда шаманские пляски помогают исправить ситуацию, иногда нет. Для выполнения запросов используется оберточный класс "ПрямойЗапрос".
Цитата:ИМХО "рекомендованный стабильный релиз" 2.5.0.1 отличается в худшую сторону от ночной сборки 2.5, т.е. использовать нужно именно ночную сборку smile.gif
Значит информация на сайте о рекомендованном стабильном релизе 2.5 является ложной. А ночные сборки на базы в полсотни юзверей пусть ставят мазохисты с альтернативной ориентацией - начальство им обеспечит все 33 удовольствия. Получается, стабильного релиза 2.5 нет.
Цитата:Да, в работе с исключениями в 2.5 еще есть баги, тут не буду спорить, но это не так страшно (ИМХО).
В 203 sedmin недавно исправлял работу с исключениями.
Я планировал также перенести его правки в 2.5, т.к. уже есть примеры тестов по исключениям, которые проходят в 203, но не в 2.5
Сможешь подсказать -
1) какие лики ты нашел ?
2) каким инструментом для проверки ликов пользуешься? что посоветуешь? давно хочу подобным инструментов пользоваться smile.gif Желательно, уже залеченным smile.gif
Под исключениями я имел в виду вызовы CBLModule::RaiseExtRuntimeError. Эта функция генерит стандартное C++ исключение (что хорошо видно в отладчике). Со всеми
вытекающими последствиями. Т.е. если перед вызовом были выделены ресурсы, потом вызван RuntimeError, а потом добавлена очистка ресурсов, то очистка никогда не выполнится. Из тех исходников, что у меня есть:
1. CBinaryData::CallAsProc - case procWriteString:
Происходит выделение памяти, потом RaiseRuntimeError, потом delete.
2. COLEDBCommand:
arseQuery. Наблюдаю в коде очень заботливый комментарий
try
{
m_MetaNameParser.Parse();
}
catch (CMNPException* MNPException)
{
strErr = szMNPErrorPrefix + MNPException->GetErrorDescr();
RuntimeError(strErr);
MNPException->Delete(); // TODO этот код никогда не работает
};
ИМХО, чтобы его написать, времени потребовалось существенно больше, чем просто поменять местами две строки
Так что, инструмент для отлова таких ликов - обычные глаза.
Если говорить вообще о ликах, то лучший инструмент - это встроенная противоликовая система, когда все вызовы new подменяются их отладочными вариантами, которые запоминают все выделения памяти. Аналогично с delete - удаляет из списка выделенных блоков удаляемые блоки. Пример такой системы есть, например, на RSDN.
Кроме памяти есть еще другие ресурсы (GDI, файлы и т.д.) Для этого уже можно использовать инструменты вроде BoundsChecker или Rational PurifyPlus.