Название: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 00:42 Здравствуйте, господа форумчане. Часто бывает так, что в Qt Creator приложение собирается и
компилируется, но вот при запуске выбивает ошибку. Как в данном случаи понять где в коде ошибка, и что за ошибка? Отладчиком можно в принципе найти ее, но он в данном случаи не выдаст сообщение об ошибке. С помощью него пока мне удавалось просто узнать в какой строчке ошибка, какие переменные не были созданы, ну и подобное. Может существует еще какой-нибудь обработчик ошибок для подобных случаев? или может я не знаю всех возможных функций отладчика в Qt Creator? Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: torwig от Ноябрь 14, 2014, 01:06 Вы правы, зачастую так и бывает, что компилируется приложение а ошибки уже потом появляются)
Расскажите, какие именно ошибки вы пытаетесь найти? Разыменование нулевого указателя, выход за пределы массива, двойное удаление, неудачную попытку открытия файла или подключения по сети? Выводите в qDebug() например сообщения, что пошло отклонение от ожидаемого поведения, есть еще Q_ASSERT(). Где-то есть тут обширная тема об исключениях. Некоторые объекты фреймворка Qt могут испускать сигналы об ошибке, операции могут возвращать false в случае неудачи. Или вы нечто иное имеете в виду? Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: Fregloin от Ноябрь 14, 2014, 09:19 К сожалению в сях не выводится подробное сообщение какв делфи, там выводится название функции и класс где ошибка в рантайме
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 09:21 Да, я это и имел ввиду. Правда хотелось бы, чтобы при этом еще Qt Creator в таких случаях указывал что именно за ошибка. В моем же случае у меня выдается после запуска приложения вот такая ошибка.
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 09:26 Спасибо всем за ответы)) жаль конечно, что как в делфи подробная информация не выводится.
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: vulko от Ноябрь 14, 2014, 09:35 Ты хоть в дебаге запускаешь то?
Билд дебажный? Должен отвалиться и показать место в коде (не обязательно твоем), где отвалилось и стэк. По стеку найдешь место, которое ведет к проблеме. В дельфи такого, если правильно помню, нет. Хотя может и есть, последний раз с дельфи я работал в 99-м году. Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 09:46 После пошаговой отладки, я нашел место ошибки. Я так понимаю ошибка из-за того, что я обращаюсь к QGridLayout, который был создан ранее для QGroupBox, когда добавляю кнопки в этот layout. У меня это делается в своем классе, который может создавать как виджеты типа QGroupBox, так и виджеты других нескольких типов. Походу когда я создал один экземпляр класса как QGroupBox(в данном случае создаю и layout и прицепляю его к этому виджету), и потом создал другой экземпляр класса для QPushButton (как массив кнопок), я пытаюсь добавить эти кнопки в этот layout, оно просто не видит этот layout, так как он относится к другому ранее созданному экземпляру класса (QGroupBox). Может из-за этого и приложение выдает ошибку при запуске. Отладчик как раз на месте добавления нового созданного виджета в layout и останавливает свою работу, бросая курсор в файл библиотеки qlayout.h перед строчкой Q_DECLARE_PRIVATE(QLayout). Я прав?
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: vulko от Ноябрь 14, 2014, 10:28 После пошаговой отладки, я нашел место ошибки. Я так понимаю ошибка из-за того, что я обращаюсь к QGridLayout, который был создан ранее для QGroupBox, когда добавляю кнопки в этот layout. У меня это делается в своем классе, который может создавать как виджеты типа QGroupBox, так и виджеты других нескольких типов. Походу когда я создал один экземпляр класса как QGroupBox(в данном случае создаю и layout и прицепляю его к этому виджету), и потом создал другой экземпляр класса для QPushButton (как массив кнопок), я пытаюсь добавить эти кнопки в этот layout, оно просто не видит этот layout, так как он относится к другому ранее созданному экземпляру класса (QGroupBox). Может из-за этого и приложение выдает ошибку при запуске. Отладчик как раз на месте добавления нового созданного виджета в layout и останавливает свою работу, бросая курсор в файл библиотеки qlayout.h перед строчкой Q_DECLARE_PRIVATE(QLayout). Я прав? возможно. сложно дать точный ответ когда не видишь кода. что за ошибка то хоть? при обращении к qgridlayout ссылка нормальная? Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 14:17 Вот пример кода:
mywidget.h Код: #ifndef MYWIDGET_H mywidget.cpp Код: #include "mywidget.h" main.cpp Код: #include "mywidget.h" Работа программы останавливается на group_layout->addWidget(wgt) в функции create(void *parent, unsigned type, int x, int y, int w, int h) в ветви else if(wgt_type == BUTTON){....}. Почему-то не хочет добавлять в layout кнопку? Как уже говорил ранее ошибка проявляется, только при запуске приложения. Может кто знает, как решить эту проблему? Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: kambala от Ноябрь 14, 2014, 14:27 ну так для group_layout не выделена память, что непонятного? очевидно BUTTON попадается раньше GROUP.
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 14:33 Ясно. Так может есть идеи, как можно layout в данном случаи правильно прикрепит к GroupBox, чтобы потом при создании с помощью класса MyWidget кнопки на GroupBox, она автоматом добавлялась в layout? Ну типа того, как в некоторых других средах программирования, там ручками layout не нужно создавать, он уже имеется на GroupBox.
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 14:41 Ах да еще, может кто-то знает как можно реализовать этот пример без приведения типов qobject_cast?
Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: vulko от Ноябрь 14, 2014, 14:54 Ясно. Так может есть идеи, как можно layout в данном случаи правильно прикрепит к GroupBox, чтобы потом при создании с помощью класса MyWidget кнопки на GroupBox, она автоматом добавлялась в layout? Ну типа того, как в некоторых других средах программирования, там ручками layout не нужно создавать, он уже имеется на GroupBox. не городить огород и сделать все ООПэшненько. т.е. не надо пытаться объединить все виджеты в один, их же не просто так вынесли в разные классы. Название: Re: Как найти ошибку в коде, если ошибка выдается уже при запуске приложения? Отправлено: billy4685 от Ноябрь 14, 2014, 15:10 спасибо за советы, в дальнейшем учту)
|