Details
-
Bug
-
Resolution: Done
-
P1: Critical
-
5.6.0
-
None
-
Windows Versions Used: Windows 10, 8.1
QT Version: 5.6.0
Seen in:
* Visual Studio 2015 compiler MSVC2015 (32bit and 64bit)
* Visual Studio 2013 compiler MSVC2013 (32bit and 64bit)
Description
Take the following files...
main.qml
import QtQuick 2.4 import QtQuick.Layouts 1.0 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles.Flat 1.0 as Flat import QtQuick.Extras 1.4 import QtQuick.Extras.Private 1.0 ApplicationWindow { id: window width: 480 height: 860 visible:true ColumnLayout{ anchors.fill: parent Button { Layout.fillWidth: true text:"Press To Crash" onClicked:{ var component; var config; component = Qt.createComponent("LargeFileWithError.qml"); config = component.createObject(window) } } ListView { id: listView Layout.fillHeight: true Layout.fillWidth: true model:logMessages delegate: Text{ text:display font.pixelSize: 11 } Connections{ target:logMessages onDataChanged:{ listView.positionViewAtEnd(); // AutoScroll } } } } }
LargeFileWithError.qml
import QtQuick 2.0 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 Rectangle { anchors.fill: parent Flickable{ anchors.fill: parent contentWidth: parent.width contentHeight: 4000 ColumnLayout{ id:flickableLayout anchors.fill: parent spacing: 0 Repeater{ model:100 Slider{ // Value does not exist and should throw QML Error: // qrc:/LargeFileWithError.qml:16: ReferenceError: causeErrorValue is not defined value:causeErrorValue } } } } }
main.cpp
#include <QtGui/QGuiApplication> #include <QtQml/QQmlApplicationEngine> #include <Windows.h> #include <QStringListModel> #include <QQmlContext> static void QTDDebugHandler(QtMsgType type, const QMessageLogContext &, const QString &sMsg); static QStringListModel s_testListModel; int main(int argc, char *argv[]) { qInstallMessageHandler(QTDDebugHandler); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("logMessages", &s_testListModel); engine.load(QUrl("qrc:/main.qml")); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); } void QTDDebugHandler(QtMsgType type, const QMessageLogContext &, const QString &sMsg) { int iInsertRow = s_testListModel.rowCount(); if (s_testListModel.insertRow(iInsertRow)) { s_testListModel.setData(s_testListModel.index(iInsertRow), sMsg); } OutputDebugStringA(sMsg.toLatin1().constData()); OutputDebugStringA("\n"); }
When pressing the button "Press To Crash" the application will crash. The purpose is to generate a bunch of QML errors to be displayed. It seems to be a race condition, because the more QML errors that are occurring the more likely the crash will be to happen. In the example given, 100 QML errors should show up and the crash happens almost every time.
The crash is occurring in qtdeclarative\src\qml\qml\qqmlcomponent.cpp line 921 because enginePriv->erroredBindings has changed to null.