2016-07-13 23 views
1

Hin und wieder bekomme ich eine Bestätigung in QVector::operator[]. Ich kann diese Behauptung nicht brechen.Breaking on Assertions mit CDB in Qt Creator

Ich habe alle Vorschläge in this Antwort versucht, und sie entweder nicht funktionieren, oder sind nicht das, was ich bin nach:

Sie einen Handler für die Meldungen/Warnungen installieren können, Qt emittiert und verarbeitet sie selbst.

Ich würde es nicht jedes Mal tun müssen, wenn es passiert.

in qt Schöpfer zu Tools gehen -> Optionen -> Debugger -> GDB und wählen Sie "Stopp, wenn ein qFatal ausgegeben wird"

Diese Option ist nicht für CDB existiert.

Ich habe eine BreakInDebugger-Funktion von Hand und ein Assert-Makro, das die Funktion aufruft, codiert.

Ich möchte Qt-Code nicht berühren müssen. Außerdem kann ich auch nur qvector.h bearbeiten und eine Zeile hinzufügen, die ich tatsächlich auf brechen:

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

Ist dies nur möglich, Creator?


Update: Es scheint zu im Zusammenhang zu stehen, wo die Behauptung ausgelöst wird. Ein Beispiel, wie das funktioniert:

#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(); 
} 

Das heißt, ich den typischen Fehlerdialog mit den Optionen erhalten die Behauptung debuggen:

--------------------------- 
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 
--------------------------- 

jedoch mit einem Unit-Test-Projekt, ich bekomme nicht 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" 
+0

Die andere Frage war für mingw32 + gdb, die Vorschläge dort werden sicher nicht für cdb funktionieren. –

+0

Ja, ich weiß, ich wollte nur klarstellen, dass das kein Duplikat ist. – Mitch

+0

Ich habe https://bugreports.qt.io/browse/QTCREATORBUG-16603 erstellt. – Mitch

Antwort

1

Wie in der bug report entdeckt, dann ist dies use eines crash handler zu testlib der durch, der den Fehler Dialog deaktiviert, die in der Regel mit asse auftritt rtionen. Vorbei an das folgende Anwendungs ​​Argument für den Autotest löst das Problem:

-nocrashhandler 

This Änderung die Dokumentation für diese Funktion verbessert.