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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.