Unsolved Qt Application Crash
-
I have make a application in Qt . It running on Qt 5.8 platform . I use a mousearea control . I found that When I double click quickly . The Application will be crash .
the crash log :
Program received signal SIGSEGV, Segmentation fault.
0xb6da7b0c in QQuickEventPoint::grabber() const ()
from /data/qt/lib/libQt5Quick.so.5
(gdb) bt
bt
#0 0xb6da7b0c in QQuickEventPoint::grabber() const ()
from /data/qt/lib/libQt5Quick.so.5
#1 0xb6e3d100 in QQuickMouseArea::mouseReleaseEvent(QMouseEvent*) ()
from /data/qt/lib/libQt5Quick.so.5
#2 0xb6dc2678 in QQuickItem::event(QEvent*) ()
from /data/qt/lib/libQt5Quick.so.5
#3 0xb60c3278 in QCoreApplicationPrivate::notify_helper(QObject*, QEvent*) ()
from /data/qt/lib/libQt5Core.so.5
#4 0xb60c3408 in QCoreApplication::notify(QObject*, QEvent*) ()
from /data/qt/lib/libQt5Core.so.5
#5 0xb60c3338 in QCoreApplication::notifyInternal2(QObject*, QEvent*) ()
from /data/qt/lib/libQt5Core.so.5
#6 0xb6dd411c in QQuickWindowPrivate::deliverTouchAsMouse(QQuickItem*, QQuickPo
interEvent*) () from /data/qt/lib/libQt5Quick.so.5
#7 0xb6dd4c54 in QQuickWindowPrivate:: (QQuickItem*,
QQuickPointerEvent*, QSet<QQuickItem*>) () from /data/qt/lib/libQt5Quick.so.5
#8 0xb6dd4ec8 in QQuickWindowPrivate::deliverUpdatedTouchPoints(QQuickPointerTo
uchEvent, QSet<QQuickItem*>) () from /data/qt/lib/libQt5Quick.so.5
#9 0xb6dd5af8 in QQuickWindowPrivate::deliverTouchEvent(QQuickPointerTouchEvent
) () from /data/qt/lib/libQt5Quick.so.5
#10 0xb6dd5bdc in QQuickWindowPrivate::deliverPointerEvent(QQuickPointerEvent)
() from /data/qt/lib/libQt5Quick.so.5
#11 0xb6dd65b8 in QQuickWindowPrivate::handleTouchEvent(QTouchEvent) ()
---Type <return> to continue, or q <return> to quit---from /data/qt/lib/libQt5Quick.so.5
#12 0xb6dd7e3c in QQuickWindow::event(QEvent*) ()
from /data/qt/lib/libQt5Quick.so.5
#13 0xb60c3278 in QCoreApplicationPrivate::notify_helper(QObject*, QEvent*) ()
from /data/qt/lib/libQt5Core.so.5
#14 0xb60c3408 in QCoreApplication::notify(QObject*, QEvent*) ()
from /data/qt/lib/libQt5Core.so.5
#15 0xb60c3338 in QCoreApplication::notifyInternal2(QObject*, QEvent*) ()
from /data/qt/lib/libQt5Core.so.5
#16 0xb68ec1a8 in QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfa
cePrivate::TouchEvent*) () from /data/qt/lib/libQt5Gui.so.5
#17 0xb68eef38 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystem
InterfacePrivate::WindowSystemEvent*) () from /data/qt/lib/libQt5Gui.so.5
#18 0xb68c89f8 in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLo
op::ProcessEventsFlag>) () from /data/qt/lib/libQt5Gui.so.5
#19 0xb5cb8600 in QUnixEventDispatcherQPA::processEvents(QFlags<QEventLoop::Proc
essEventsFlag>) () from /data/qt/plugins/platforms/libqlinuxfb.so
#20 0xb60c0f18 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag) () from /data/qt/lib/libQt5Core.so.5
#21 0xb60c1328 in QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag) ()
from /data/qt/lib/libQt5Core.so.5
#22 0xb60c9980 in QCoreApplication::exec() () from /data/qt/lib/libQt5Core.so.5
#23 0x00016a84 in main (argc=0, argv=<optimized out>) at main.cpp:155
(gdb)(gdb)
(gdb) bt
-
@Mr-.Wu Can you share the QML code (or better yet a minimal example) that can duplicate the crash?
-
Chat.qml
import QtQuick 2.4 import "qrc:/ui/javascript/watch_constants.js" as Constants import "qrc:/ui/javascript/watch_functions.js" as Functions ChatForm { id: chatForm Connections { target: btnChat onClicked: { Functions.getWindow("ChatWindow.qml").createChatListComponent() } } }
ChatForm.ui.qml
import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.0 import "qrc:/ui/javascript/watch_constants.js" as Constants Item { width: 240 height: 240 property alias txtChat: txtChat property alias btnChat: btnChat Rectangle { id: rectangleChatsArea anchors.fill : parent color: Constants.LauncherBgColor Image { id: imageChatBg source: "qrc:/ui/images/launcher_bg.png" width: parent.width height: parent.height } Rectangle { height: 115 width: 115 anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter color: Constants.LauncherColor_Transparent Image { id: imageChatIoc source: "qrc:/ui/images/chat_ioc.png" } MouseArea { id: btnChat anchors.fill: parent } } Text { id: txtChat font.pixelSize: Constants.LauncherFontPixelSize font.family: Constants.LauncherFontFamily horizontalAlignment: Text.AlignHCenter anchors.bottom: parent.bottom anchors.bottomMargin: 24 anchors.horizontalCenter: parent.horizontalCenter color: Constants.LauncherTextColor width: 72 height: 24 } } }
RootWindow.qml
import QtQuick 2.7 import QtQuick.Window 2.2 import "qrc:/ui/javascript/watch_constants.js" as Constants import "qrc:/ui/javascript/watch_functions.js" as Functions Window { id: rootWindow x: 0 y: 0 width: 240 height: 240 flags: Qt.FramelessWindowHint // 显示区域 property alias rootRectangle: rootRectangle // 窗体组件(当前显示的组件) property var component: null // 点击事件 property alias rootMouseArea: rootMouseArea Rectangle { x: 0 y: 0 id: rootRectangle width: parent.width height: parent.height color: Constants.LauncherBgColor MouseArea { x: 0 y: 0 id: rootMouseArea anchors.fill: parent } } /************************************************** Function *******************************************************/ // 创建组件 function setupComponent(qml_file) { return setupComponentVisible(qml_file, true) } // 创建组件 function setupComponentVisible(qml_file, visible) { var parent = null if (component == null) parent = rootRectangle else parent = component var ret = Functions.dynamicCreateComponent(parent, qml_file, visible) if (ret != null) component = ret if(visible) component.visible = true return component } }
watch_functions.js
/* * Func: create component * Desc: dynamic create component * Para: parent , qml file , visible - true or false * Ret : component */ function dynamicCreateComponent(parent,qml_file,visible) { if(parent == null) { console.log("create component failed . the parent is null ."); return null; } if(qml_file == null) { console.log("create component failed . the qml file is null ."); return null; } var component = Qt.createComponent(qml_file); var qml_object = component.createObject(parent,{"x": 0, "y": 0}); if(qml_object !=null) qml_object.visible = visible; console.log("create component : " + qml_object + " , parent : " + qml_object.parent); return qml_object; } /* * Func: get window * Desc: get window * Para: window name * Ret : */ function getWindow(window_name) { if(window_name == null) { console.log("the window name is null . can't get it ."); return null; } var window = ui_management.existsWindow(window_name); if(window == null) { console.log("can't find the window named : " + window_name); return null; } return window.getQmlObject(); }
ChatWindow.qml
import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.0 import "qrc:/ui" import "qrc:/ui/javascript/watch_constants.js" as Constants import "qrc:/ui/javascript/watch_functions.js" as Functions RootWindow { id: chatWindow visible: false width: 240 height: 240 signal createChatListComponent; Component.onCompleted: { createChatListComponent.connect(setupListView) console.log("Chat Window Completed") } Component.onDestruction: { createChatListComponent.disconnect(setupListView) console.log("Chat Window Destruction") } /************************************************** Function *******************************************************/ // 打开消息列表 function setupListView() { setupComponent(Constants.Compontent_ChatList) } }
-
When I double click quickly the mousearea named btnChat . The Application will be crash . This is a probabilistic event
-
@ambershark can you found the problem ?
-
@Mr-.Wu I'll play with it tomorrow and see if it crashes for me. I'll let you know.
Edit: Sorry didn't have time today, but will try to check it this week for sure. Busy time deadline wise for me right now.
-
@ambershark said in Qt Application Crash:
Sorry didn't have time today, but will try to check it this week for sure. Busy time deadline wise for me right now.
Okay. Thanks
-
@ambershark Did you do the test?
-
@Mr-.Wu Sorry I haven't yet. I have a tight deadline and had to write a ton of code this week. Worked some 12 hour days. I will try to test it soon though. Hopefully someone else can give it a shot too so you're not waiting on just me.
-
@ambershark Can you help us . We can't found the problem how to cause.
-
@Mr-.Wu Have you tried running the code with Qt 5.9? 5.9 is a long term release and if it's really a bug chances are good that it will be fixed with one of the bugfix releases.
-
@Mr-.Wu Ok finally had some time today to look at it. With the code you provided I can't get it to run as it's missing things.
So here's what we can do. Can you provide a simple example that duplicates the behavior? Does this happen with any mousearea or is it specific to one in your project? If you setup just a simple rect with a mousearea could you get it to crash? Does it crash while running in qmlscene or only when you run as an app?:
I tested with the following code:
import QtQuick 2.4 import QtQuick.Controls 2.0 Rectangle { width: 400 height: 400 color: "black" MouseArea { anchors.fill: parent onClicked: { parent.color = "red" } onDoubleClicked: { parent.color = "black" } } }
Everything was fine as fast as I could click. I just ran it with qmlscene though. Try that on your system and see if you can duplicate the crash if not, see what is different between how you use a MouseArea and what this simple one is doing. Then try to step it from a base MouseArea to your and find the point at which it breaks.
If you could give me a working project I could test yours and see if I can find the issue. I'm still learning QML myself though. I've been using Qt with QtWidgets for a very long time but am pretty new to QML as of last year. And since I haven't had a big project that needed it I just haven't had the exposure to the small problems it can produce yet. So I don't see anything obvious in your code.