Mitch
Mitch

Reputation: 24406

Breaking on assertions with CDB in Qt Creator

Every now and then I get an assertion in QVector::operator[]. I'm unable to break on this assertion.

I've tried all of the suggestions in this answer, and they either don't work, or are not what I'm after:

You can install a handler for the messages/warnings that Qt emits, and do your own processing of them.

I would rather not have to do this each time it happens.

in qt Creator go to Tools -> Options -> Debugger -> GDB and select "Stop when a qFatal is issued"

This option doesn't exist for CDB.

I have coded a BreakInDebugger function by hand and an assert macro that calls the function.

I don't want to have to touch Qt code. Besides, I could also just edit qvector.h and add a line that I can actually break on:

if (i >= 0 && i < d->size)
    qDebug() << "oops";

Is this possible using only Creator?


Update: It seems to be related to where the assertion is triggered from. An example like this works:

#include <QGuiApplication>
#include <QtQuick>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QVector<int> i;
    i[0] = 0;

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

That is, I get the typical error dialog with options to debug the assertion:

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!

Program: C:\dev\qt5-dev-debug\qtbase\lib\Qt5Cored.dll
Module: 5.8.0
File: C:\dev\qt5-dev\qtbase\src\corelib\global\qglobal.cpp
Line: 3045

ASSERT failure in QVector<T>::operator[]: "index out of range", file c:\dev\qt5-dev-debug\qtbase\include\qtcore\../../../../qt5-dev/qtbase/src/corelib/tools/qvector.h, line 433

(Press Retry to debug the application)

---------------------------
Abort   Retry   Ignore   
---------------------------

However, with a unit test project, I don't get any dialog:

#include <QString>
#include <QtTest>

class Untitled3Test : public QObject
{
    Q_OBJECT

public:
    Untitled3Test();

private Q_SLOTS:
    void testCase1();
};

Untitled3Test::Untitled3Test()
{
}

void Untitled3Test::testCase1()
{
    QVector<int> i;
    i[0] = 0;
}

QTEST_APPLESS_MAIN(Untitled3Test)

#include "tst_untitled3test.moc"

Upvotes: 1

Views: 825

Answers (1)

Mitch
Mitch

Reputation: 24406

As discovered in the bug report, this is due to testlib's use of a crash handler that disables the error dialog that usually occurs with assertions. Passing the following application argument to the auto test solves the issue:

-nocrashhandler

This change improves the documentation for this feature.

Upvotes: 1

Related Questions