Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Segmentation fault when exiting when linked against Qt 6.9.1
Forum Updated to NodeBB v4.3 + New Features

Segmentation fault when exiting when linked against Qt 6.9.1

Scheduled Pinned Locked Moved Solved General and Desktop
36 Posts 7 Posters 3.3k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • l3u_L Offline
    l3u_L Offline
    l3u_
    wrote on last edited by l3u_
    #7

    Okay. The only place where I use a delete statement in code that is active is that I remove a lock file in my database backend when I close the connection. That seems to be unrelated to that layout/widget issue, I can as well open a database, close it (and then the delete happens) and I still get a segfault on closing. All deleteLater statements I use happen in classes that aren't even instatiated at this point … so I'm pretty sure that neither a delete statement, nor a deleteLater call happens during closing.

    Seems to me it has something to do with the QDockWidgets I use and the QTabBar they are displayed with, no?

    I just tried to compile against a local debugging enabled build of Qt 6.9.0 – no crash there. But the crash against 6.9.1 happens every time …

    1 Reply Last reply
    0
    • l3u_L Offline
      l3u_L Offline
      l3u_
      wrote on last edited by
      #8

      I really have no idea why this happens. Neither my MainWindow class, nor any of the QDockWidgets shown even have a destructor, so I don't even have the chance to delete something that should not be deleted …

      The MainWindow catches a closeEvent though. I set a break point there and stepped through what happens. The whole function exits like it should. No problem …

      The crash happens really late, after everything seems to be already cleaned up:

      QCoreApplication::exec ()
          at /home/tobias/Qt/qtbase-everywhere-src-6.9.1/src/corelib/kernel/qcoreapplication.cpp:1450
      1450        threadData->quitNow = false;
      (gdb) n
      1452        if (self)
      (gdb) n
      1453            self->d_func()->execCleanup();
      (gdb) n
      1455        return returnCode;
      (gdb) n
      main (argc=1, argv=0x7fffffffd178) at /home/tobias/tmp/git/muckturnier/src/main.cpp:130
      130     }
      (gdb) n
      
      Thread 1 "muckturnier" received signal SIGSEGV, Segmentation fault.
      0x0000555555a55b76 in removeWidgetRecursively (li=<optimized out>, w=0x5555571eec40)
          at /home/tobias/Qt/qtbase-everywhere-src-6.9.1/src/widgets/kernel/qlayout.cpp:474
      474             if (child->widget() == w) {
      (gdb) n
      [Thread 0x7ffff49e7900 (LWP 10439) exited]
      [Thread 0x7ffff45ff6c0 (LWP 10442) exited]
      [New process 10439]
      
      Program terminated with signal SIGSEGV, Segmentation fault.
      The program no longer exists.
      

      Line 130 of my main.cpp is at the very end, after return application.exec():

      129        return application.exec();
      130    }
      131
      

      Does this help?!

      jsulmJ 1 Reply Last reply
      0
      • l3u_L l3u_

        I really have no idea why this happens. Neither my MainWindow class, nor any of the QDockWidgets shown even have a destructor, so I don't even have the chance to delete something that should not be deleted …

        The MainWindow catches a closeEvent though. I set a break point there and stepped through what happens. The whole function exits like it should. No problem …

        The crash happens really late, after everything seems to be already cleaned up:

        QCoreApplication::exec ()
            at /home/tobias/Qt/qtbase-everywhere-src-6.9.1/src/corelib/kernel/qcoreapplication.cpp:1450
        1450        threadData->quitNow = false;
        (gdb) n
        1452        if (self)
        (gdb) n
        1453            self->d_func()->execCleanup();
        (gdb) n
        1455        return returnCode;
        (gdb) n
        main (argc=1, argv=0x7fffffffd178) at /home/tobias/tmp/git/muckturnier/src/main.cpp:130
        130     }
        (gdb) n
        
        Thread 1 "muckturnier" received signal SIGSEGV, Segmentation fault.
        0x0000555555a55b76 in removeWidgetRecursively (li=<optimized out>, w=0x5555571eec40)
            at /home/tobias/Qt/qtbase-everywhere-src-6.9.1/src/widgets/kernel/qlayout.cpp:474
        474             if (child->widget() == w) {
        (gdb) n
        [Thread 0x7ffff49e7900 (LWP 10439) exited]
        [Thread 0x7ffff45ff6c0 (LWP 10442) exited]
        [New process 10439]
        
        Program terminated with signal SIGSEGV, Segmentation fault.
        The program no longer exists.
        

        Line 130 of my main.cpp is at the very end, after return application.exec():

        129        return application.exec();
        130    }
        131
        

        Does this help?!

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #9

        @l3u_ You could disable functionality until it does not crash, then you would know which part leads to the crash.

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • Christian EhrlicherC Online
          Christian EhrlicherC Online
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #10

          @Axel-Spoerl : dockwidgets... 😛

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          0
          • l3u_L Offline
            l3u_L Offline
            l3u_
            wrote on last edited by
            #11

            The problem is that the only custom thing I do is the closeEvent override – everything else happens inside the default Qt code … and even if I remove the custom closeEvent, the segfault is the same (which is not really surprising, when I stepped through everything that happens, the function returns, and the crash happens way later, while we're long deep inside Qt …).

            @Christian-Ehrlicher : May I suppose from what you wrote that this is not the first time strange things happen when dock widgets are messed with?! ;-)

            The only thing I can definitely say is that some change from 6.9.0 to 6.9.1 causes this, because it never happens with 6.9.0, and it always happens with 6.9.1 …

            1 Reply Last reply
            0
            • l3u_L Offline
              l3u_L Offline
              l3u_
              wrote on last edited by
              #12

              Luckily, my desktop is still quite decent, so I could git bisect out the commit that introduced this.

              If I checkout

              commit 19c4db4201e8933fbbbf951809ceff30e99b4458
              QDockWidget: don't access a QMainWindow that's under destruction
              

              everything is fine, no crash. One commit later, at

              commit ab6f1ad77852a427ae73172ca11dacf876a0cbf7
              QMainWindowLayout: Fix leaking of unused tab bars
              

              I get the segfault.

              I would call it a regression …

              1 Reply Last reply
              3
              • Axel SpoerlA Offline
                Axel SpoerlA Offline
                Axel Spoerl
                Moderators
                wrote on last edited by
                #13

                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 is QDockWidget::setWidget() used? In which state are they, when the crash occurs (docked on the main window / Floating / Tabbed)?

                Software Engineer
                The Qt Company, Oslo

                1 Reply Last reply
                1
                • l3u_L Offline
                  l3u_L Offline
                  l3u_
                  wrote on last edited by
                  #14

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

                  1 Reply Last reply
                  1
                  • l3u_L Offline
                    l3u_L Offline
                    l3u_
                    wrote on last edited by l3u_
                    #15

                    Btw. I didn't change this code since Qt 5.6 back in 2017 …

                    1 Reply Last reply
                    0
                    • Axel SpoerlA Offline
                      Axel SpoerlA Offline
                      Axel Spoerl
                      Moderators
                      wrote on last edited by
                      #16

                      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.

                      Software Engineer
                      The Qt Company, Oslo

                      1 Reply Last reply
                      2
                      • l3u_L Offline
                        l3u_L Offline
                        l3u_
                        wrote on last edited by
                        #17

                        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

                        SGaistS 1 Reply Last reply
                        0
                        • l3u_L l3u_

                          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

                          SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #18

                          @l3u_ done for you :-)

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          1
                          • l3u_L Offline
                            l3u_L Offline
                            l3u_
                            wrote on last edited by
                            #19

                            Thanks :-)

                            1 Reply Last reply
                            0
                            • l3u_L Offline
                              l3u_L Offline
                              l3u_
                              wrote on last edited by l3u_
                              #20

                              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 …

                              1 Reply Last reply
                              0
                              • Axel SpoerlA Offline
                                Axel SpoerlA Offline
                                Axel Spoerl
                                Moderators
                                wrote on last edited by Axel Spoerl
                                #21

                                Great reproducer!
                                Someone decades ago felt like storing unused tab bars for later re-usage in QMainWindowLayout.
                                Those were soft-leaked and taken care off, when QApplication 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 its QMainWindow 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 ;-)

                                Software Engineer
                                The Qt Company, Oslo

                                1 Reply Last reply
                                3
                                • l3u_L Offline
                                  l3u_L Offline
                                  l3u_
                                  wrote on last edited by
                                  #22

                                  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 …

                                  jsulmJ 1 Reply Last reply
                                  0
                                  • l3u_L l3u_

                                    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 …

                                    jsulmJ Offline
                                    jsulmJ Offline
                                    jsulm
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #23

                                    @l3u_ You can see in the bug report:
                                    Fix Version/s: 6.10.0 Beta2, 6.11.0 FF

                                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    1 Reply Last reply
                                    0
                                    • l3u_L Offline
                                      l3u_L Offline
                                      l3u_
                                      wrote on last edited by l3u_
                                      #24

                                      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"

                                      jsulmJ 1 Reply Last reply
                                      0
                                      • l3u_L l3u_

                                        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"

                                        jsulmJ Offline
                                        jsulmJ Offline
                                        jsulm
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #25

                                        @l3u_ Yes, it looks like it was cherry picked to 6.9 branch, so may end up in some 6.9.x version :-)

                                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        1 Reply Last reply
                                        0
                                        • Axel SpoerlA Offline
                                          Axel SpoerlA Offline
                                          Axel Spoerl
                                          Moderators
                                          wrote on last edited by
                                          #26

                                          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:

                                          1. https://codereview.qt-project.org/c/qt/qtbase/+/653890
                                          2. https://codereview.qt-project.org/c/qt/qtbase/+/653891
                                          3. https://codereview.qt-project.org/c/qt/qtbase/+/653892
                                          4. https://codereview.qt-project.org/c/qt/qtbase/+/653893
                                          5. https://codereview.qt-project.org/c/qt/qtbase/+/653894

                                          Software Engineer
                                          The Qt Company, Oslo

                                          1 Reply Last reply
                                          3

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved