Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: apv1989 от Августа 11, 2010, 20:04



Название: Программа вылетает без отладчика.
Отправлено: apv1989 от Августа 11, 2010, 20:04
Господа, здравствуйте.

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

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

Какие у кого есть идеи по причинам такого факта и по борьбе с ним?


Название: Re: Программа вылетает без отладчика.
Отправлено: Drafter от Августа 11, 2010, 20:23
Под какой операционкой компилируете?


Название: Re: Программа вылетает без отладчика.
Отправлено: iRQSX от Августа 11, 2010, 20:37
Возможно прога не может найти библиотек QT, положите все используемые библиотеки в папку с прогой или пропишите в PATH. Было такое под виндой.


Название: Re: Программа вылетает без отладчика.
Отправлено: apv1989 от Августа 11, 2010, 20:55
Под линухом и под виндой одно и тоже, а dll находит.
Под линухом еще смешнее бывают косяки, Ubuntu 9.04 и qt 4.6.3/ Хочу через стандартный openfiledialog открыть файл, вызваю диалог, а окно пустое.... ну вообще ничего в нем нету.


Название: Re: Программа вылетает без отладчика.
Отправлено: Авварон от Августа 11, 2010, 21:03
проверьте инициализацию переменных... как-то было что в дебаг сборке компилер занулял указатели и проверки на 0 срабатывали, а при переносе в релиз зануления не стало


Название: Re: Программа вылетает без отладчика.
Отправлено: DS_tm от Августа 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(),
и, соответсвенно получал указатель на родительский класс, вместо дочернего.


Название: Re: Программа вылетает без отладчика.
Отправлено: Авварон от Августа 11, 2010, 22:16
паттерны выучили, а использовать динамик каст вместо статик каста - нет:)


Название: Re: Программа вылетает без отладчика.
Отправлено: DS_tm от Августа 11, 2010, 22:29
паттерны выучили, а использовать динамик каст вместо статик каста - нет:)
Ну как говориться, молодец! )))
В том то и соль, что должен быть статик каст ибо динамик вернет нам ноль, а не указатель на обрезаный объект. Скажите спасибо что не использовал привидение в стиле Си))
ЗЫ: А вообще не мудренно выучить сначала паттерны, ибо это штука межязыковая, в отличии от кастов. Люди, учите паттерны, экономте собственные нервы и время! =)


Название: Re: Программа вылетает без отладчика.
Отправлено: Alex Custov от Августа 11, 2010, 23:10
Люди, учите паттерны, экономте собственные нервы и время! =)

Люди, НЕ учите паттерны. Прокачивайте свой опыт, после чего >половины паттернов станет очевидна.


Название: Re: Программа вылетает без отладчика.
Отправлено: apv1989 от Августа 11, 2010, 23:24
Авварон, спасибо. Что сказал куда копать. действительно из за указателя вылетало. Проверил, теперь честно где удаляю объект, выставляю указатель в NULL.  :) Давно не прогал на плюсах, забыл о всяких таких мелочах.


Название: Re: Программа вылетает без отладчика.
Отправлено: SASA от Августа 12, 2010, 11:09
Код:
 в дебажной версии все нормально роботает, а собираю релиз версию, все сыпется
Я в таком случае собираю релиз версию с отладочной информацией. Дебагер подцепляется отлично и показывает место падения.

Под линухом после падения создаются дампы. По ним можно посмотреть колстек, и примерно локализовать ошибку.


Название: Re: Программа вылетает без отладчика.
Отправлено: apv1989 от Августа 12, 2010, 12:17
SASA, подскажи тогда что изменить в настройках сборки, чтобы релиз с дебажной информацией собирался, а то я добавляю -g, но дебагер все равно не цепляется. и -DQT_NO_DEBUG пробовал убирать, все равно не цепляется.


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


Название: Re: Программа вылетает без отладчика.
Отправлено: apv1989 от Августа 13, 2010, 01:48
Как я понимаю используются разные Dll QtCored4 или QtCore4 и остальные Dll тоже с бквой d или без, в зависимости от сборки. Но к примере QtGuid весит 140 мб, а QtGui всего 9... пока я просто из QtGuid вырезаю всю дебажную информацию через strip, хоть получается чуть больше чем просто QtGui, но потом upx и вся программа с dll весит уже 5 м.б. против первоначальных 200~ =)


Название: Re: Программа вылетает без отладчика.
Отправлено: xokc от Августа 13, 2010, 08:48
дебаг от релиза как раз наличием дебажной информации и отличается вроде
В общем случае дебаг от релиза может отличаться чем угодно - вплоть до разного состава компилируемых файлов. Не говоря уже о разных опциях компилятора и методов оптимизации.


Название: Re: Программа вылетает без отладчика.
Отправлено: SASA от Августа 13, 2010, 09:54
SASA, подскажи тогда что изменить в настройках сборки, чтобы релиз с дебажной информацией собирался, а то я добавляю -g, но дебагер все равно не цепляется. и -DQT_NO_DEBUG пробовал убирать, все равно не цепляется.
Я работую в VS. Там просто ставиш галочку - генери дебужную инфу.
Код:
дебаг от релиза как раз наличием дебажной информации и отличается вроде
Основные отличия в настройках компилятора и линкуемых библиотеках.
Студийный компилятор кладёт инфу в отдельный файл *.pdb. А в основной файл добавляет uid по которому сопосталяет exe и pdb файлы. Грубо говоря, дебужная информация это таблица соответствия инструкции в исполняемом файле и строчке кода. При подении система говорит: инструкция по такому-то адресу сделала не то. Дебагер смотрит в таблицу, и говорит какой строке это соответствует.