LINUX.ORG.RU

можно ли сделать QT разговорчивее?


0

0
Вопрос такой, новичок в QT, и сталкнулся с такой проблемой, что при ошибках моих (по типу сегфолтов, или индексов массивов) кутешное приложения просто вцлетает и всё(без сообщений), нельзяли сделать так чтоб хоть какоенить описание было причины вылета?
Может стоит взять язык без арифметики указателей? И с контролем границ массивов? Или это не по-пацански?
imp ★★
()
Включи отладочную информацию. Компиляй с помощью gcc. По умолчанию gcc вставляет весьма говорливый terminate handler со стектрейсом.

Если не поможет --- прогони программу под valgrind.

И вообще ищи где запорол память.
gaa ★★
()
Выпей с ним на брудершафт.
Demon37 ★★★★
()
Запускай из консоли увидишь segmentation fault ;)

а вообще это правильно, это правило тишины, используй исключения
dimon555 ★★★★★
()
> что при ошибках моих (по типу сегфолтов, или индексов массивов)

Пользуйся try-catch.

smh ★★★
()
Ответ на: комментарий от smh
>> что при ошибках моих (по типу сегфолтов, или индексов массивов)
> Пользуйся try-catch.


Бугага, простите! Давно ли try-catch-ем можно сегфолт поймать?
gaa ★★
()
> какоенить описание было причины вылета?

Чем тебе поможет сообщение вида "из адреса XX было обращение в адрес YY"?

Компиляй с ключем -ggdb (с отладочной инфой для дебаггера), запускай прогу из gdb ("gdb ./program", потом в отладчике - "run аргументы_программе") - как вылетит - делай бэктрейс ("bt") и смотри, где траблы (т.е. обычный цикл отладки)

Spectr ★★★
()
Ответ на: комментарий от gaa
> Бугага, простите! Давно ли try-catch-ем можно сегфолт поймать?

Прощаю. Проблемы здесь скорее всего очень простые: обращение к null указатялям и выход за пределы масива. Человек новичок, о чем сам говорит. А поэтому я предполагаю, что все его проблемы решаются try-catch. Я в этом почти не сомневаюсь.

smh ★★★
()
Ответ на: комментарий от smh
> А поэтому я предполагаю, что все его проблемы решаются try-catch. Я в этом почти не сомневаюсь.

Ещё раз: как try-catch-ем поймать разыменовывание нулевого указателя в C++?
gaa ★★
()
нужно просто не использовать Qt и C++.
Tu3eK
()
Ответ на: комментарий от smh
> Пользуйся try-catch.

Сами тролли не рекомендую использовать try/catch. Откуда такие советчики берутся? Чем вам банальный дебаг не угодил? Брякнул поинт и смотришь, где завалилось.

mamay_cozak
()
Ответ на: комментарий от gaa
> Ещё раз: как try-catch-ем поймать разыменовывание нулевого указателя в C++?

Никак. Фигню я сморозил. Каша в голове. :-)

smh ★★★
()
Ответ на: комментарий от hello_world
так в том то и дело, куте в тихоря вылетает (((

тебе уже всё объяснили выше. и как посмотреть что случилось и все остальное. Ищи где запорол память, раз получаешь seg-fault'ы. Или используй любой другой более разговорчивый язык, в котором есть биндинги к qt, если так не хочешь отлаживать свои программы.

teferiincub
()
tr/catch в случае qt безполезен

Но вот тот, кто говорит что qt не рекомендовали пользоваться исключениями, ничего не понимает

В таких случаях помагает только отладчик. Или своя обретка, которая бросает исключения

namezys ★★★★
()
Разговорчивее Qt делает функция qInstallMsgHandler, но это, похоже, не для твоего случая. В работе с указателями не стесняйся пользоваться auto_ptr, scoped_array и др. Если это не критично для производительности, при доступе к элементам массивов используй безопасные функции типа QVector::value(), а также Java-style итераторы Qt. "Скользкие" ситуации обрамляй Q_ASSERT'ом. Советующих сменить язык и прочее, не относящееся к твоей теме, посылай на х...
mannaz
()
Ответ на: комментарий от mannaz
основные проблемы с виджетами кутешными, - тейбл виджет, с ним были проблемы, выходил за, границы, при этом приложение без всяких коментариев вылетало (в консоли ниче не было), т.е же проблемы с указателями на кутешные обьекты (не инициализированные) -- также без цеременно приложение вылетат, а вопрос состоял в том если какой ключ к куте чтоб она показывала хоть какой-нить комент по этому поводу, если кто не в теме в куте есть сборшик мусора, не его ли это проделки? и не надо расказывать про gdb, и таму подобные веши, читайте вопрос
hello_world
() автор топика
Ответ на: комментарий от hello_world
> сновные проблемы с виджетами кутешными, - тейбл виджет, с ним были проблемы, выходил за, границы, при этом приложение без всяких коментариев вылетало (в консоли ниче не было), т.е же проблемы с указателями на кутешные обьекты (не инициализированные) -- также без цеременно приложение вылетат

Да. А ты чего хотел?

> если кто не в теме в куте есть сборшик мусора, не его ли это проделки?


Это ты не в курсе. Так что смотри, где память запорол и не пытайся найти магический ключик.
gaa ★★
()
Ответ на: комментарий от hello_world
КюТэ головного мозга?

>т.е же проблемы с указателями на кутешные обьекты (не инициализированные)

какие претензии к QT тут? Всё на уровне языка C++.

>а вопрос состоял в том если какой ключ к куте чтоб она показывала хоть какой-нить комент по этому поводу,

Учи что такое указатели, и как с ними работать.

> и не надо расказывать про gdb, и таму подобные веши, читайте вопрос

тогда тебе лучше обратится к новости на прошлой неделе, про биндинг Mono к QT, либо же начать учить язык на котором пишешь (что судя по твоему вопросу, маловероятно)

Spectr ★★★
()
Ответ на: комментарий от hello_world
Используй Mono и C#. Не забивай себе голову асмом на стероидах.
Spectr ★★★
()
Ответ на: комментарий от hello_world
> в богатых домах филадельфии принято показывать строку кода в которой это произошло (по дефолту)

Ну и пиши тогда на жабе и не суйся в C++.
gaa ★★
()
Ответ на: комментарий от gaa
поставил обрашени по не выделенной памяти, statusbar->showMessage("STARTING .... "); прошел netxt-ами в gdb до сей точки (строки кода нет, в которой это произошло, да и в консоль приложени не пишет):

(gdb) next
Single stepping until exit from function __do_global_ctors_aux,
which has no line number information.
0x0804c2f1 in _init ()
(gdb) next
Single stepping until exit from function _init,
which has no line number information.
0x08080139 in __libc_csu_init ()
(gdb) next
Single stepping until exit from function __libc_csu_init,
which has no line number information.
0x0039dd91 in __libc_start_main () from /lib/libc.so.6
(gdb) next
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Thread debugging using libthread_db enabled]
[New Thread -1208129840 (LWP 24391)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1208129840 (LWP 24391)]
0x0109a34d in QStatusBar::showMessage () from /usr/lib/qt4/lib/libQtGui.so.4
(gdb) next
Single stepping until exit from function _ZN10QStatusBar11showMessageERK7QStringi,
which has no line number information.
Couldn't get registers: No such process.
(gdb)
hello_world
() автор топика
Ответ на: комментарий от Spectr
прокатило, аргумент не подскажете (прога отделяется от терминала)
hello_world
() автор топика
Ответ на: комментарий от hello_world
Не занимайся программированием, по крайней мере на си/крестах.
yoghurt ★★★★★
()
Ответ на: комментарий от hello_world
может перед тем как садиться программировать стоит почитать страуструпа?
Reset ★★★★★
()
Ответ на: комментарий от hello_world
>int main()
>{

>X *p;

>p->b = 34 ;

>cout << p->b << endl;

>return 0;

>};


на твое поделие мое g++ выдает сегфолт. и ни строчки не пишет где он произошёл и с какого черта я полез в невыделенную память. То что ты хочешь к qt никакого отношения не имеет, всё дело в С++. Тебе уже советовали почитать Страуструпа. Может стоит об этом подумать?
teferiincub
()
Ответ на: комментарий от teferiincub
ЁЁЁпт >на твое поделие мое g++ выдает сегфолт

да ЁПТ а почему (скомпилированное через) КУТЕ на аналогичное поведение не выдает СЕГФОЛТ, а просто в тихоря вылетает? (ниче в консоли не пишет). А теперь вопрос, как сделать чтоб ПИСАЛО СЕГФОЛТ В КОНСОЛИ ????

hello_world
() автор топика
Ответ на: комментарий от teferiincub
>Тебе уже советовали почитать Страуструпа. Может стоит об этом подумать?

Ух епт, а что Страуструп в своей книге написал, какой аргумент надо дать qmake, чтоб она писал в консоли, что произошел СЕГФОЛТ? (главу не подскажите?

hello_world
() автор топика
Ответ на: комментарий от teferiincub
>может перед тем как садиться программировать стоит почитать страуструпа?

может перед тем как отвечать на вопрос, стоит понять суть вопроса?
hello_world
() автор топика
Ответ на: комментарий от hello_world
>А теперь вопрос, как сделать чтоб ПИСАЛО СЕГФОЛТ В КОНСОЛИ ????

Возможно у тебя альтернативное qt или альтернативное g++. У меня всегда писало где бы я не накосячил с памятью. Естественно если я вызывал программку на qt из консоли =)

teferiincub
()
Ответ на: комментарий от teferiincub
$ cat main.cpp
#include <QApplication>
#include <QPushButton>

int main(int argc, char** argv)

{
    QApplication app(argc, argv);
    QPushButton *btn;
    btn->show();
    return app.exec();

}

$ ./btn
Segmentation fault

ЧЯДНТ?
teferiincub
()
Ось какая? На всякий добавь qmake'у в проект такое: CONFIG += debug console
Sectoid ★★★★★
()
Какая ось? Очень похоже по симптомам на оффтопик. Линуксячий qt черезмерно говорлив.
eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.