Russian Qt Forum
Ноябрь 05, 2024, 22:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Программа вылетает без отладчика.  (Прочитано 8362 раз)
apv1989
Гость
« : Август 11, 2010, 20:04 »

Господа, здравствуйте.

Кто-нибудь сталкивался с подобной проблемой: под отладчиком программа нормально работает, а когда запускаю просто так скомпилированный экзешник, то прога вылетает с эксепшеном и закрывается. Как ловит такие ошибка, подскажите.

А второй глюк похож, но немного по-другому себя проявляет: в дебажной версии все нормально роботает, а собираю релиз версию, все сыпется ((

Какие у кого есть идеи по причинам такого факта и по борьбе с ним?
Записан
Drafter
Гость
« Ответ #1 : Август 11, 2010, 20:23 »

Под какой операционкой компилируете?
Записан
iRQSX
Гость
« Ответ #2 : Август 11, 2010, 20:37 »

Возможно прога не может найти библиотек QT, положите все используемые библиотеки в папку с прогой или пропишите в PATH. Было такое под виндой.
Записан
apv1989
Гость
« Ответ #3 : Август 11, 2010, 20:55 »

Под линухом и под виндой одно и тоже, а dll находит.
Под линухом еще смешнее бывают косяки, Ubuntu 9.04 и qt 4.6.3/ Хочу через стандартный openfiledialog открыть файл, вызваю диалог, а окно пустое.... ну вообще ничего в нем нету.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Август 11, 2010, 21:03 »

проверьте инициализацию переменных... как-то было что в дебаг сборке компилер занулял указатели и проверки на 0 срабатывали, а при переносе в релиз зануления не стало
Записан
DS_tm
Гость
« Ответ #5 : Август 11, 2010, 21:32 »

Данная ситуевина возникает если указатель на объект имеет неверный размер. Чаще всего это результат приблизительно таких действий:

Код
C++ (Qt)
class A
{
 ...
 void funcA();
};
 
class B : public class A
{
 ...
 void funcB();
}
 
///
void someFunction()
{
 A *a = new A;
 ...
 B *b = static_cast<B *>(a);
 b->funcB();
}
 

Тоесть клиент расчитывает что используеться указатель на класс B, хотя на самом деле используеться указатель на класс А.
У меня такая ситуация возникла, когда я, в паттерне "Фабричный метод", забыл переопределять виртуальную функцию createObject(),
и, соответсвенно получал указатель на родительский класс, вместо дочернего.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Август 11, 2010, 22:16 »

паттерны выучили, а использовать динамик каст вместо статик каста - нет:)
Записан
DS_tm
Гость
« Ответ #7 : Август 11, 2010, 22:29 »

паттерны выучили, а использовать динамик каст вместо статик каста - нет:)
Ну как говориться, молодец! )))
В том то и соль, что должен быть статик каст ибо динамик вернет нам ноль, а не указатель на обрезаный объект. Скажите спасибо что не использовал привидение в стиле Си))
ЗЫ: А вообще не мудренно выучить сначала паттерны, ибо это штука межязыковая, в отличии от кастов. Люди, учите паттерны, экономте собственные нервы и время! =)
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Август 11, 2010, 23:10 »

Люди, учите паттерны, экономте собственные нервы и время! =)

Люди, НЕ учите паттерны. Прокачивайте свой опыт, после чего >половины паттернов станет очевидна.
Записан
apv1989
Гость
« Ответ #9 : Август 11, 2010, 23:24 »

Авварон, спасибо. Что сказал куда копать. действительно из за указателя вылетало. Проверил, теперь честно где удаляю объект, выставляю указатель в NULL.  Улыбающийся Давно не прогал на плюсах, забыл о всяких таких мелочах.
Записан
SASA
Гость
« Ответ #10 : Август 12, 2010, 11:09 »

Код:
 в дебажной версии все нормально роботает, а собираю релиз версию, все сыпется
Я в таком случае собираю релиз версию с отладочной информацией. Дебагер подцепляется отлично и показывает место падения.

Под линухом после падения создаются дампы. По ним можно посмотреть колстек, и примерно локализовать ошибку.
Записан
apv1989
Гость
« Ответ #11 : Август 12, 2010, 12:17 »

SASA, подскажи тогда что изменить в настройках сборки, чтобы релиз с дебажной информацией собирался, а то я добавляю -g, но дебагер все равно не цепляется. и -DQT_NO_DEBUG пробовал убирать, все равно не цепляется.
Записан
whirlwind
Гость
« Ответ #12 : Август 12, 2010, 17:04 »

SASA, подскажи тогда что изменить в настройках сборки, чтобы релиз с дебажной информацией собирался, а то я добавляю -g, но дебагер все равно не цепляется. и -DQT_NO_DEBUG пробовал убирать, все равно не цепляется.
хм, а зачем?
дебаг от релиза как раз наличием дебажной информации и отличается вроде
Записан
apv1989
Гость
« Ответ #13 : Август 13, 2010, 01:48 »

Как я понимаю используются разные Dll QtCored4 или QtCore4 и остальные Dll тоже с бквой d или без, в зависимости от сборки. Но к примере QtGuid весит 140 мб, а QtGui всего 9... пока я просто из QtGuid вырезаю всю дебажную информацию через strip, хоть получается чуть больше чем просто QtGui, но потом upx и вся программа с dll весит уже 5 м.б. против первоначальных 200~ =)
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #14 : Август 13, 2010, 08:48 »

дебаг от релиза как раз наличием дебажной информации и отличается вроде
В общем случае дебаг от релиза может отличаться чем угодно - вплоть до разного состава компилируемых файлов. Не говоря уже о разных опциях компилятора и методов оптимизации.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 22.