![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
spumer |
![]() ![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте.
При попытке подкинуть кривой хостнейм, программа вылетала с крит. ошибкой. Затем я начал отлавливать это исключение и пытаться завершить процесс более-менее спокойно. Но к сожалению это приводит к отказу приложения и система его закрывает.
|
|
|
![]() |
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
скорее всего, у тебя resolver.resolve(query) возвращает пустой итератор, а ты его не проверяешь, да ещё и пытаешься использовать. по вполне понятным причинам программа падает.
попробуй сделать что-то типа
Сообщение отредактировал Iron Bug - 13.7.2011, 22:41 |
|
|
spumer |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
скорее всего, у тебя resolver.resolve(query) возвращает пустой итератор, а ты его не проверяешь, да ещё и пытаешься использовать. по вполне понятным причинам программа падает. попробуй сделать что-то типа
К сожалению не помогло, попробовал даже через стандартную фишку записи ошибки:
Результат тот же. Когда идет запись ошибки в переменную, крит. вылета нет, все как при try/catch. При нормальном хосте все отлично работает ![]() |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
в примерах везде ловится std::exception.
(например, http://www.gamedev.net/blog/950/entry-2249...boostasio) может, у тебя просто не установлены флаги для отлова эксепшнов? под какую систему собираешь и чем? Сообщение отредактировал Iron Bug - 13.7.2011, 23:14 |
|
|
spumer |
![]()
Сообщение
#5
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
в примерах везде ловится std::exception. (например, http://www.gamedev.net/blog/950/entry-2249...boostasio) может, у тебя просто не установлены флаги для отлова эксепшнов? под какую систему собираешь и чем? Windows 7. VS 2008 Express. |
|
|
Iron Bug |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
попробуй поставить флаг /EHsc и ловить std::exception, как в ссылке, которую я привела последней. либо /EHa и тогда заработает catch(...). в венде если флаги не стоят, она тупо ничего не делает при стандартных эксепшнах. можно поэкспериментировать с флагами эксепшнов.
прочитать про всё это барахло можно тут, например: http://msdn.microsoft.com/en-us/library/1d...5(v=vs.80).aspx Сообщение отредактировал Iron Bug - 14.7.2011, 7:40 |
|
|
spumer |
![]()
Сообщение
#7
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Iron Bug, Спасибо. Буду читать материал по ссылкам. Как разберусь, отпишусь либо сюда, либо в новый топик, если этот умрет.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
spumer |
![]()
Сообщение
#9
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#10
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
у меня под линюксом вот такой код
работает нормально. то есть, буст выбрасывает эксепшн типа boost::system::system_error и всё отрабатывает в catch. линкуется это всё с библиотекой boost_system и обязательно с многопоточностью (в венде это флаг компилера). ещё можешь проверить, что у тебя не завалялись где-нибудь разные версии библиотек, если они называются одинаково. в венде конфликты библиотек - обычное дело. но в бусте вроде библиотеки содержат версию и это не должно быть проблемой. Сообщение отредактировал Iron Bug - 17.7.2011, 0:18 |
|
|
spumer |
![]() ![]()
Сообщение
#11
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
у меня под линюксом вот такой код Отдельно он и у меня работает. Пробовал баловаться с флагами -MD, -MT. Исключение происходит в конструкторе класса. Создается объект класса, внутри себя он подключается куда я ему сказал. [Перед вызовом методов хочу поместить проверку на наличие ошибок в экземпляре класса, метод getLastError() const возвращает мне номер ошибки] Затем я вызываю его методы и они запрашивают определенную инфу с сервера. Удаляю объект. P.S: В качестве граф. оболочки для приложения использую QT4. Все статически линкуется. |
|
|
spumer |
![]()
Сообщение
#12
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Проделал след. опыт: в конце функции, в которой создается экземпляр моего класса, я добавил:
дабы сгенерировать исключительную ситуации на подобие той, что возникает в конструкторе. Однако это не вызвало вылет программы, ошибка записалась и приложение продолжило работу. Я не могу понять почему все именно так. |
|
|
spumer |
![]() ![]()
Сообщение
#13
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Все решилось довольно просто.
Как я понял, проблема возникала из-за использования моего недопиленного костыля:
Видимо внутри себя он(resolver.resolve) что-то делал такое с этими указателями, что вызывало исключительную ситуацию. Я посмотрел на конструкторы udp::resolver::query, и обнаружил: Цитата basic_resolver_query( const protocol_type & protocol, const std::string & host, const std::string & service, resolver_query_base::flags resolve_flags = address_configured); Внес исправления:
А в функции запроса, я сделал соответствующую проверку:
Возник еще вопрос. Если я пытаюсь перед выходом из функции удалить объект ptr - ошибка. Если я пытаюсь использовать boost::scoped_ptr - ошибка. Не получается освободить ресурсы. У меня конечно есть идея: создать boost::shared_ptr объект, поместить его в класс MainWindow, а в этой функции лишь .. ну вы поняли. Вобщем переложить работу с памятью для класса SE_Query на умный указатель и вынести его за пределы функции. Ну а если в целом, то все работает. Осталось лишь утечки памяти отловить. Забыл: перед выходом из функции удалить объект ptr Если пытаюсь удалить в блоке if(ptr->getLastError()), в конце самой функции конечно идет удаление этого объекта. |
|
|
Iron Bug |
![]()
Сообщение
#14
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
по этим отдельным кускам ничего сказать нельзя. ошибки с распределением памяти могут быть очень хитрые и вовсе даже не зависеть от той переменной, которую удаляешь. приводи весь код - тогда будет видно. а так гадать бесполезно.
|
|
|
spumer |
![]()
Сообщение
#15
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#16
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
а на входе что подаёшь?
host может оказаться нулевым. это не учтено, я не знаю, что выдаст lexical_cast на нулевой указатель. но это мелочи. в деструкторе SE_Query делается попытка удалить указатели:
а они запросто могут быть нулевыми, ибо в конструкторе не все пути их инициализируют. |
|
|
spumer |
![]()
Сообщение
#17
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
spumer |
![]()
Сообщение
#18
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#19
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
lexical_cast по-моему, он там вообще не требуется. стандартный конструктор std::string жрёт char* на входе без проблем. если бы дело было в скорости, было бы ещё понятно, но тут она явно не приоритетна, ибо операции разовые. а lexical_cast как раз имеет свойство кидать эксепшны и в норме его всегда нужно оборачивать в try-catch. Реакция венды на delete ptr перед return; . дык, оно вообще не информативно. абсолютно пустое сообщение венды, чисто для юзера. если бы там хоть подробности были раскрыты - тогда ещё бы что-то было ценное. Сообщение отредактировал Iron Bug - 18.7.2011, 22:50 |
|
|
spumer |
![]()
Сообщение
#20
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#21
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
spumer |
![]()
Сообщение
#22
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 28.3.2011 Пользователь №: 2546 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо за ответы твои.
А утечками памяти я вскоре займусь, еще не весь функционал написан. Впереди еще потоки, мьютексы и оптимизация. |
|
|
Iron Bug |
![]()
Сообщение
#23
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
да, в деструкторе socket_ тоже нулевой.
в общем, всю программу шерстить и вставлять проверки на NULL. иначе там сплошные дыры. А утечками памяти я вскоре займусь, еще не весь функционал написан. Впереди еще потоки, мьютексы и оптимизация. лучше сначала разобраться с работой с указателями и только потом - всё остальное. тут базовые вещи нарушены, самые основы программирования на С, без понимания основ дальше продвигаться смысла нет. разбирать на куски и тестировать, если что-то не понятно. а не форсировать и не забуряться в дебри. потом эти ошибки будет сложнее выковыривать, а они никуда не денутся. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 3.6.2025, 13:52 |