Segmentation fault when exiting when linked against Qt 6.9.1
-
Ooops, I am guilty for the guilty commit!
What's obviously crashing is a
QDockWidget
. Can you tell us more about those?
How are they added? how isQDockWidget::setWidget()
used? In which state are they, when the crash occurs (docked on the main window / Floating / Tabbed)? -
@Axel-Spoerl Hi, nice to meet the right guy at once ;-)
I meanwhile filed a bug report about this: https://bugreports.qt.io/browse/QTBUG-137755
For all dock widgets I first instatiate a widget, like this (all are simple
QWidgets
– with quite complex stuff inside, but still):m_registrationPage = new RegistrationPage(this, m_sharedObjects); ...
then, I create the dock, format it, set the widget and hide it, like this:
m_playersDock = new QDockWidget(tr("Anmeldung"), this); m_playersDock->setWidget(m_registrationPage); formatDockWidget(m_playersDock, QStringLiteral("playersDock")); addDockWidget(Qt::TopDockWidgetArea, m_playersDock); connect(m_registrationPage, &RegistrationPage::raiseMe, m_playersDock, &QDockWidget::raise); m_playersDock->hide();
Where the formatting is:
void MainWindow::formatDockWidget(QDockWidget *dock, const QString &id) { dock->setObjectName(id); dock->setContextMenuPolicy(Qt::PreventContextMenu); dock->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); }
When I start the program, all docks are hidden. If I close it again in this state, I get no segfault.
Opening a database makes them show up, by default attached to the main window and tabbed. When closing the program then, the segfault happens.
Interestingly, if I close my database again, the docks are hidden again – but still, I get a segfault on closing.
-
Hm. Looks like I went too far and we have to revert or follow up on this patch.
Can you do me a favor: Report it as a bug, assign it to me? I'll fix it this week. -
I already filed one here: https://bugreports.qt.io/browse/QTBUG-137755 – I can't assign it to you though (or better said, I don't know how to do that …)
Somebody already commented on it, and mentioned these two PRs:
https://codereview.qt-project.org/c/qt/qtbase/+/637198
https://codereview.qt-project.org/c/qt/qtbase/+/636652 -
I already filed one here: https://bugreports.qt.io/browse/QTBUG-137755 – I can't assign it to you though (or better said, I don't know how to do that …)
Somebody already commented on it, and mentioned these two PRs:
https://codereview.qt-project.org/c/qt/qtbase/+/637198
https://codereview.qt-project.org/c/qt/qtbase/+/636652 -
Just to also leave this here: I meanwhile could strip it down to a minimal example producing the crash, cf. the sources attached to https://bugreports.qt.io/browse/QTBUG-137755
Produces the crash reliably when linked against Qt 6.9.1. You have to run the program twice: The first time, it exits normally. The second time, when the window geometry and state are restored, it segfaults on exiting.
No delete, no deleteLater, nothing special at all …
-
Great reproducer!
Someone decades ago felt like storing unused tab bars for later re-usage inQMainWindowLayout
.
Those were soft-leaked and taken care off, whenQApplication
got destroyed.
Reading the state back from settings causes the original tab bar (created in the C++ part) to become unused, but not removed from itsQMainWindow
parent. That ultimately lead to a double delete and the crash.
Let's see, if my thorough reviewers let me get away without writing an autotest ;-) -
Wow, that was fast :-) Thanks for the immediate fix! Nice to see my stuff helped here!
That was quite deep inside Qt apparently … where will this land? Qt 6.10.0? Or will it be backported?
I tried to cherry-pick it to a 6.9.1 checkout to test it, but it seems that's no trivial task …
-
Wow, that was fast :-) Thanks for the immediate fix! Nice to see my stuff helped here!
That was quite deep inside Qt apparently … where will this land? Qt 6.10.0? Or will it be backported?
I tried to cherry-pick it to a 6.9.1 checkout to test it, but it seems that's no trivial task …
-
Ah okay. So no 6.9 backport? I just wondered, because in the respective "Change ID" https://codereview.qt-project.org/c/qt/qtbase/+/653727, it's listed: "Fixes: QTBUG-137755 Pick-to: 6.10 6.9"
-
Ah okay. So no 6.9 backport? I just wondered, because in the respective "Change ID" https://codereview.qt-project.org/c/qt/qtbase/+/653727, it's listed: "Fixes: QTBUG-137755 Pick-to: 6.10 6.9"
-
The fix will land in 6.9.2, which we plan to release on August 14th.
If you want to cherry pick and compile locally, please make sure to pick the following 5 commits in the right order:
-
Great that you are using dock widgets! As you may have suspected:
QDockWidget
is slightly closer to my heart than other creatures in the widget zoo ;-) -
First, it was just a
QTabBar
interface. But over the years, it got more and more complex, and at some point, I learned aboutQDockWidget
s – and I loved them at first sight ;-) The same as the tab bar if you want – but way more if you need it. The possibility to arrange them as you like and need is really nice. This is actually a powerful tool, with a great user experience.QDockWidget
s really rock! They do, from time to time, cause some headache (this is actually not the first bug I filed about them ;-) – but they are really cool. -
@l3u_
Could you mark this thread as solved, please?