Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Installation and Deployment
  4. Using QSettings on Mac crashes on launch. Is there a fix?

Using QSettings on Mac crashes on launch. Is there a fix?

Scheduled Pinned Locked Moved Solved Installation and Deployment
qsettingsmaccrash
16 Posts 3 Posters 5.6k Views
  • 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi and welcome to devnet,

    There's a link to a gerrit submission that you can use to patch and build Qt. Since you can reproduce the crash from the bug report, please update the report with the information you have to reproduce it.

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

    C 1 Reply Last reply
    1
    • S Offline
      S Offline
      sandy.martel23
      wrote on last edited by
      #3

      You are using QSettings in a global variable. Move the initialisation inside the main().

      Looks like you are using a statically linked Qt, right ? Your QSettings is a global variable, QSettings implementation itself rely on other global variables. The order of initialisation of global variables is undefined.
      What could work, from worst to best:

      • shuffle the link order around to get QSettings globals initialised first (that would be a very fragile fix)
      • link Qt as a shared library, shared lib would be loaded and initialised before your code.
      • Don't build a QSettings as a global, replace it with a QSettings * and build it in main().
      C 1 Reply Last reply
      1
      • SGaistS SGaist

        Hi and welcome to devnet,

        There's a link to a gerrit submission that you can use to patch and build Qt. Since you can reproduce the crash from the bug report, please update the report with the information you have to reproduce it.

        C Offline
        C Offline
        Crossy
        wrote on last edited by
        #4

        @SGaist Hello. Thanks for your response. I'm just recompiling Qt now with the patch from the gerrit submission. If it does work, I will link a minimal example in the bug report that will reproduce the initial error. Is that the best way to do it?

        1 Reply Last reply
        0
        • S sandy.martel23

          You are using QSettings in a global variable. Move the initialisation inside the main().

          Looks like you are using a statically linked Qt, right ? Your QSettings is a global variable, QSettings implementation itself rely on other global variables. The order of initialisation of global variables is undefined.
          What could work, from worst to best:

          • shuffle the link order around to get QSettings globals initialised first (that would be a very fragile fix)
          • link Qt as a shared library, shared lib would be loaded and initialised before your code.
          • Don't build a QSettings as a global, replace it with a QSettings * and build it in main().
          C Offline
          C Offline
          Crossy
          wrote on last edited by
          #5

          @sandy.martel23 Thanks for your response. I'm going to see if the patch in the bug report fixes the error. If not this will be what I try next :) Just a quick question about it though (if that's ok) :)

          At the moment I've got globalsettings.cpp. In there is where I have 'QSettings settings' and then I refer to this object in some static functions which are in globalsettings.cpp. Example below:

          // globalsettings.cpp
          #include <QSettings>
          #include "globalsettings.h"
          
          // Initialise some variables from globalsettings.h.
          
          QSettings settings;
          
          void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
          {
              settings.setValue("dayNumber", day);
          }
          

          In main.cpp I define the information needed for QCoreApplication which is why I haven't included app name etc as parameters in the QSettings object.

          So my question, is, where should I move the initialisation of the QSettings object, as unless I've misunderstood (possible because I'm a newbie), I can't have a main loop in globalsettings.cpp, and if I put it in the main loop in main.cpp, it won't be accessible. As I said, I may have totally misunderstood but would appreciate any clarification :)

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #6

            You don't need a global QSettings. Just create one when you need to either read or write a setting and be done with it.

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

            C S 2 Replies Last reply
            0
            • SGaistS SGaist

              You don't need a global QSettings. Just create one when you need to either read or write a setting and be done with it.

              C Offline
              C Offline
              Crossy
              wrote on last edited by
              #7

              @SGaist Thanks. I assume this means that the bug report was not related to my problem? Thanks for your help!

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #8

                The bug report was about a corrupted file which doesn't match your use case.

                All in all, since you have already built Qt with the patch applied, did you also test it for your use case ?

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

                C 1 Reply Last reply
                0
                • SGaistS SGaist

                  The bug report was about a corrupted file which doesn't match your use case.

                  All in all, since you have already built Qt with the patch applied, did you also test it for your use case ?

                  C Offline
                  C Offline
                  Crossy
                  wrote on last edited by
                  #9

                  @SGaist Qt with the patch applied is still building ;( I tested the above with the original build I was using when I got the error and the program loaded with no problems. Thanks again for your help :)

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    Still building ? What machine do you have ? What options did you pass to configure ?

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

                    C 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      Still building ? What machine do you have ? What options did you pass to configure ?

                      C Offline
                      C Offline
                      Crossy
                      wrote on last edited by Crossy
                      #11

                      @SGaist A 2011 Mac book pro. The reason it's still building because it failed about an hour in while I was out. So I'm building it again :)

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #12

                        If you only need the core modules for your application, just build qtbase, that will save you lots of times

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

                        C 1 Reply Last reply
                        0
                        • SGaistS SGaist

                          If you only need the core modules for your application, just build qtbase, that will save you lots of times

                          C Offline
                          C Offline
                          Crossy
                          wrote on last edited by
                          #13

                          @SGaist Thanks - not sure if i did that or not, lol, but I'll do it next time as I'm only using the core modules :)

                          1 Reply Last reply
                          0
                          • SGaistS SGaist

                            You don't need a global QSettings. Just create one when you need to either read or write a setting and be done with it.

                            S Offline
                            S Offline
                            sandy.martel23
                            wrote on last edited by
                            #14

                            @Crossy said:

                            QSettings settings;

                            void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
                            {
                            settings.setValue("dayNumber", day);
                            }

                            SGaist is right, the code should look like this:

                            void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
                            {
                            QSettings settings; // <-- NOT a global
                            settings.setValue("dayNumber", day);
                            }

                            This is much better than your current implementation, since the destructor of QSettings will save/sync the preferences right away.
                            And if the global is really what is causing the problem, that would fix it.

                            C 1 Reply Last reply
                            0
                            • S sandy.martel23

                              @Crossy said:

                              QSettings settings;

                              void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
                              {
                              settings.setValue("dayNumber", day);
                              }

                              SGaist is right, the code should look like this:

                              void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
                              {
                              QSettings settings; // <-- NOT a global
                              settings.setValue("dayNumber", day);
                              }

                              This is much better than your current implementation, since the destructor of QSettings will save/sync the preferences right away.
                              And if the global is really what is causing the problem, that would fix it.

                              C Offline
                              C Offline
                              Crossy
                              wrote on last edited by
                              #15

                              @sandy.martel23 Thanks for your help :) It was the global causing the problem - after changing it to how you and SGaist suggested, it has worked :) Thank you!

                              1 Reply Last reply
                              0
                              • SGaistS Offline
                                SGaistS Offline
                                SGaist
                                Lifetime Qt Champion
                                wrote on last edited by
                                #16

                                Good !

                                Since everything is working now, please mark the thread as solved using the "Topic Tool" button so that other forum users may know a solution has been found :)

                                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
                                0

                                • Login

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