@tugo

При отладке QtCreator не останавливается на ошибке, как тогда отлаживаться?

В режиме отладки приложение вылетает вот с такой информацией:
ASSERT failure in QVector<T>::operator[]: "index out of range", file D:\Qt\Qt5.3.1_mingw\5.3\mingw482_32\include/QtCore/qvector.h, line 385
Invalid parameter passed to C runtime function.

Это здорово, но бесполезно. Почему QtCreator не останавливается в месте ошибки? В чем тогда польза этого ассерта? Как тогда найти место с ошибкой?

Может нужно как-то настроить отладчик?

UPDATE
Спасибо за помощь.
Вопрос свелся к тому, куда поставить точку останова.
В файл qvector.h точка останова не ставилась:
template <typename T>
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
  return data()[i]; }


Вышел из ситуации, переопределив QtMessageHandler:
#include <iostream>
#include <QApplication>
#include <QString>

void myMessageOutput(QtMsgType type, const QMessageLogContext & context, const QString & msg)
{
    switch (type)
    {
    case QtDebugMsg:
        std::cerr << QString("Debug: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
        break;
    case QtWarningMsg:
        std::cerr << QString("Warning: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
        break;
    case QtCriticalMsg:
        std::cerr << QString("Critical: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
        break;
    case QtFatalMsg:
        std::cerr << QString("Fatal: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
        abort();
    }
}

int main(int argc, char *argv[])
{
    qInstallMessageHandler(myMessageOutput);
    QApplication a(argc, argv);
    
    return a.exec();
}

На abort(); точка останова поставилась.
  • Вопрос задан
  • 4409 просмотров
Решения вопроса 1
@xandox
Он и не должен. Поставь breakpoint куда тебе нужно и он на нем остановиться.
assert-ы нужны для того что бы сообщать разработчику, что он накосячил. Внутри assert вызывает abort() который без условно прерывает выполнение программы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@mamkaololosha
> "index out of range"
Он всё написал. Ассерт вызывается внутри вектора. Где ему останавливаться? В векторе? Поставьте брекпоинты, посмотрите что будет. Прикрутите gdb qt-project.org/doc/qtcreator-2.6/creator-debugger-...
Ответ написан
Комментировать
@TriKrista
Тут, по ходу, всё зависит от ОС.
В Linux, QtCreator останавливается в месте ошибки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы