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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Q_ASSERT молча вываливаеться  (Прочитано 9874 раз)
DmP
Гость
« : Январь 24, 2006, 15:58 »

Qt 4.1 + Mingwin + Code::Blocks
Q_ASSERT - молча завершает программу с сообщением:
"exited 3
Debugger finished with status 0"

Можно ли как нибудь сделать, что бы отладчик как-то перехватывал это дело, что бы посмотреть стек вызовов?

Помню, в wxWidgets даже выскакивает сообщение, хочу ли ли я завершить приложение а в Qt как то тихо. Что можно сделать? А то как-то не понятно зачем здесь вообще этот Q_ASSERT. =)
Записан
nEoN
Гость
« Ответ #1 : Январь 24, 2006, 17:06 »

Можно перепределить обработчик таких вещей.
QtMsgHandler qInstallMsgHandler ( QtMsgHandler handler );
Описание и пример в ассистенте.
Записан
Dendy
Гость
« Ответ #2 : Январь 24, 2006, 17:08 »

Перехватить оконечно можно:

Код:
void myMessageHandler( QtMsgType type, const char * msg )
{
  switch ( type )
  {
    case QtDebugMsg:
      break;
    case QtWarningMsg:
      break;
    case QtCriticalMsg:
      break;
    case QtFatalMsg:
      break;
  }
}

...

qInstallMsgHandler( myMessageHandler );


Ставишь там брикпоинтьІ чтоб каллстек получить аль свои сообщения с вьІводом куда взбредёт.

А вот НЕ завершить программу - уж извольте. ФатальньІе ошибки - ошибки программирования (всякие вьІходьІ за предельІ массива и прочее) не гарантируют нормальное продолжение работьІ программьІ. Следовательно все глюки, которьІе полученьІ будут после первой ошибки - симптомьІ, не отображающие наличие реального бага в коде, а лишь следствие предьІдущей ошибки.

Так что тут всё в порядке - максимум ошибок, которьІх можно получить - 1 (одна) штука на 1 (одну) отладку. Устраняем, ищем следующие.

Веселый
Записан
DmP
Гость
« Ответ #3 : Январь 25, 2006, 09:48 »

Цитата: "nEoN"
Можно перепределить обработчик таких вещей.
QtMsgHandler qInstallMsgHandler ( QtMsgHandler handler );
Описание и пример в ассистенте.


Это я сделал в первую очередь, когда не смог получить отладочных сообщений ни от IDE ни от утилиты sysinternal - DebugViewNt.

А при чем здесь Q_ASSERT? Сорри. =)

Ни кто не видел как работает wxASSERT под VC6? Вот мне хотелось, что бы было также. =)

добавлено спустя 18 минут:

 Ага ... понял: =)

Код:

void MessageHandler(QtMsgType type, const char *msg)
{
    QByteArray str;
    switch (type)
    {
        case QtDebugMsg:
            str = "Debug: ";
            break;
        case QtWarningMsg:
            str = "Warning: ";
            break;
        case QtCriticalMsg:
            str = "Critical: ";
            break;
        case QtFatalMsg:
            str = "Fatal: "; // << --- Сдесь ставим точку перехвата =)
            abort();
    }
    str += msg;
    str += "\r\n";
    pMsgFile->write(str);
    pMsgFile->flush();
}


Спасибо за помощь. =)

добавлено спустя 3 минуты:

 Тогда у меня еще несколько вопросов, можно ли в место abort() вставит, что-то типа int 3, или как там его? =)
И как можно под виндой отправить отладочное сообщение IDE? Или в тот же ViewDebug?
Записан
Dendy
Гость
« Ответ #4 : Январь 25, 2006, 10:22 »

OpenSource рулит (-;  Смотреть сюда:

qglobal.cpp
Код:
void qt_message_output(QtMsgType msgType, const char *buf)
Записан
DmP
Гость
« Ответ #5 : Январь 25, 2006, 12:12 »

Цитата: "Dendy"
OpenSource рулит (-;  Смотреть сюда:

qglobal.cpp
Код:
void qt_message_output(QtMsgType msgType, const char *buf)


Спасибо, посмотрю. =) Опенсорц конечно рулит, но правда не всегда. Веселый

То, о чем я спрашивал, реализуеться так:
Код:

#include <windows.h>

void MessageHandler(QtMsgType type, const char *msg)
{
    QByteArray str;
    switch (type)
    {
        case QtDebugMsg:
            str = "Debug: ";
            break;
        case QtWarningMsg:
            str = "Warning: ";
            break;
        case QtCriticalMsg:
            str = "Critical: ";
            break;
        case QtFatalMsg:
            str = "Fatal: ";
    }
    str += msg;
    str += "\r\n";
    pMsgFile->write(str);
    pMsgFile->flush();

    QString wstr(str);
    OutputDebugString((WCHAR*)wstr.constData());

    if(type == QtFatalMsg)
    {
pMsgFile->close();
asm("int $0x3");
abort();
    }
}


добавлено спустя 7 минут:

 Конечно, еще хочеться выводить сообщение в окошечко "Debugger" Code::Blocks, но это наверное уже на гране фантастики. =)

добавлено спустя 1 час 33 минуты:

 Не, ну это какое-то издевательство,  в режиме отладки сообщения не попадают в DebugView, хотя и пишуться в файл. Тогда как если просто запустить программу, то сообщения высвечиваються.  Грустный

Люди, помогите, как вы отлаживаете проги на GCC под виндой?
Записан
Вудруф
Гость
« Ответ #6 : Январь 26, 2006, 07:29 »

По-разному, где QMessageBox::information, где ofstream, где cerr...
-- Пишу под FAR'ом Подмигивающий
Записан
DmP
Гость
« Ответ #7 : Январь 26, 2006, 09:38 »

Цитата: "Вудруф"
По-разному, где QMessageBox::information, где ofstream, где cerr...
-- Пишу под FAR'ом Подмигивающий


Да только когда, в проекте окло 130 файлов хочеться удобства в работе =)
А FAR-ом я смотрю файл с сообщениями, он его сам прокручивает. Вот только если бы ему можно было сделать "Всегда наверху", и уменьшить размер... =)
Кстати, фокус с int 3, мне понравился, у меня автоматически в отладчике выскакивает окошко стека. =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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