Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct


    Qt World Summit: Early-Bird Tickets

    Unsolved Executing QProcess in QThread: memory leak

    General and Desktop
    7
    79
    7849
    Loading More Posts
    • 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.
    • sitesv
      sitesv last edited by

      Trying to execute 'ping' from QThread. There is a memory leak after this.

      void TMyThread::run(){
            while(work){
                  QProcess myProcess;
                  myProcess.start(exe_path,arguments);
                  myProcess.waitForFinished(500);
                  myProcess.close();
                  msleep(1000);
            }
      }
      

      I tried to use a pointer and delete statement... The result is the same...

      1 Reply Last reply Reply Quote 0
      • mrjj
        mrjj Lifetime Qt Champion last edited by

        Hi
        How do you know there is a leak ?

        sitesv 1 Reply Last reply Reply Quote 0
        • sitesv
          sitesv @mrjj last edited by

          @mrjj said in Executing QProcess in QThread: memory leak:

          Hi
          How do you know there is a leak ?

          By system monitor...
          A leak is about 4k/sec. I have been checking for a few minutes...

          mrjj Christian Ehrlicher 2 Replies Last reply Reply Quote 0
          • mrjj
            mrjj Lifetime Qt Champion @sitesv last edited by

            @sitesv
            Ok. it might internally allocate something
            that is first freed on app termination.

            If you reuse the same QProcess
            (let it be a member of the TMyThread, allocate once)

            Does it still then still leak ?

            sitesv 1 Reply Last reply Reply Quote 0
            • sitesv
              sitesv @mrjj last edited by

              @mrjj said in Executing QProcess in QThread: memory leak:

              Does it still then still leak ?

              Yes, there is still a leak.
              QProcess myProcess; moved into the class.

              sitesv 1 Reply Last reply Reply Quote 0
              • sitesv
                sitesv @sitesv last edited by

                @mrjj
                If I would use this code in while(1) of the 'main' function of the console app - there is NO memory leak.

                mrjj 1 Reply Last reply Reply Quote 0
                • mrjj
                  mrjj Lifetime Qt Champion @sitesv last edited by

                  @sitesv
                  but you only create the thread once , so it should be the same ?

                  sitesv 1 Reply Last reply Reply Quote 0
                  • sitesv
                    sitesv @mrjj last edited by

                    @mrjj said in Executing QProcess in QThread: memory leak:

                    but you only create the thread once ,

                    Yes.

                    1 Reply Last reply Reply Quote 0
                    • mrjj
                      mrjj Lifetime Qt Champion last edited by

                      Hi
                      Hmm really strange then.
                      Is this on windows ?
                      I did something similar on linux and didnt notice it would leak 4K

                      sitesv 1 Reply Last reply Reply Quote 0
                      • Christian Ehrlicher
                        Christian Ehrlicher Lifetime Qt Champion @sitesv last edited by

                        @sitesv said in Executing QProcess in QThread: memory leak:

                        By system monitor...

                        This is no valid memory leak checker. Use a correct to to find leaks like e.g. valgrind.

                        Qt has to stay free or it will die.

                        1 Reply Last reply Reply Quote 2
                        • sitesv
                          sitesv @mrjj last edited by

                          @mrjj said in Executing QProcess in QThread: memory leak:

                          Is this on windows ?

                          Linux

                          @Christian-Ehrlicher
                          Is it correct, If a memory value is increasing for a few minutes?

                          Christian Ehrlicher 1 Reply Last reply Reply Quote 0
                          • Christian Ehrlicher
                            Christian Ehrlicher Lifetime Qt Champion @sitesv last edited by

                            @sitesv A system monitor is not a valid tool for such an investigation. It may be a hint that there is something wrong but nothing more. The system monitor only shows what the OS gave the process, but the OS may not free resources immediately but only when it needs it later on so use a correct tool for this.

                            Qt has to stay free or it will die.

                            sitesv 1 Reply Last reply Reply Quote 1
                            • sitesv
                              sitesv @Christian Ehrlicher last edited by

                              @Christian-Ehrlicher
                              Checked app by Valgrind. There is no memory leak...
                              Thank you. I hope there really are no errors.

                              mrjj 1 Reply Last reply Reply Quote 2
                              • mrjj
                                mrjj Lifetime Qt Champion @sitesv last edited by

                                @sitesv
                                I would leave it running for like 48 hours and see it would stabilize.
                                If its related to actually running the process on Os level, it might only allocate up to some max.

                                sitesv 1 Reply Last reply Reply Quote 1
                                • Christian Ehrlicher
                                  Christian Ehrlicher Lifetime Qt Champion last edited by

                                  Since Qt cleans up a lot of stuff during exit maybe also stop the application started with valgrind with CTRL+C and take a look at the reachable memory in the valgrind output to see if there is something interesting (start valgrind with '--show-reachable=yes')

                                  Qt has to stay free or it will die.

                                  1 Reply Last reply Reply Quote 3
                                  • sitesv
                                    sitesv @mrjj last edited by

                                    @mrjj, @Christian-Ehrlicher
                                    Thank you!

                                    1 Reply Last reply Reply Quote 0
                                    • sitesv
                                      sitesv last edited by sitesv

                                      Hi!
                                      Made a simple test:

                                      void mythread::run(){
                                          while(work){
                                              bool boolRESULT;
                                              QString output_str;
                                              QByteArray output;
                                              QStringList output_strlst;
                                              QTextCodec *codec;
                                              QString exe_path = "/bin/ping";;
                                              QStringList arguments;
                                              arguments << "127.0.0.1" << "-c" << "1";
                                      
                                              if(myProcess == nullptr) myProcess = new QProcess;
                                              myProcess->start(exe_path, arguments);
                                              myProcess->waitForFinished(500);
                                      
                                              output = myProcess->readAll();
                                              output_str = codec->toUnicode(output);
                                              output_strlst = output_str.split("\r\n");
                                      
                                              myProcess->close();
                                               
                                              boolRESULT = false;
                                              for (int i = 0; i < output_strlst.count(); i++){
                                                  boolRESULT = output_strlst[i].contains("ttl",Qt::CaseInsensitive);
                                                  if (boolRESULT) break;
                                              }
                                              emit setStatus(boolRESULT);
                                         
                                              msleep(1000);
                                          }
                                      }
                                      

                                      Valgrind output:
                                      ...
                                      ==23633== 2,400 bytes in 15 blocks are still reachable in loss record 2,049 of 2,114
                                      ==23633== at 0x4C2BBEF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
                                      ==23633== by 0x6267251: resizeSignalVector (qobject_p.h:297)
                                      ==23633== by 0x6267251: QObjectPrivate::addConnection(int, QObjectPrivate::Connection*) (qobject.cpp:330)
                                      ==23633== by 0x6268A18: QMetaObjectPrivate::connect(QObject const*, int, QMetaObject const*, QObject const*, int, QMetaObject const*, int, int*) (qobject.cpp:3453)
                                      ==23633== by 0x626FD58: QObject::connect(QObject const*, char const*, QObject const*, char const*, Qt::ConnectionType) (qobject.cpp:2911)
                                      ==23633== by 0x61BFB1F: QProcessPrivate::startProcess() (qprocess_unix.cpp:384)
                                      ==23633== by 0x61BA34D: QProcessPrivate::start(QFlagsQIODevice::OpenModeFlag) (qprocess.cpp:2246)
                                      ==23633== by 0x61BA582: QProcess::start(QString const&, QStringList const&, QFlagsQIODevice::OpenModeFlag) (qprocess.cpp:2094)
                                      ==23633== by 0x10BBBF: mythread::run() (mythread.cpp:19)

                                      ==23633== by 0x605A3B4: QThreadPrivate::start(void*) (qthread_unix.cpp:342)
                                      ==23633== by 0x6A164A3: start_thread (pthread_create.c:456)
                                      ==23633== by 0x75B1D0E: clone (clone.S:97)
                                      ...

                                      mythread.cpp 19 line is:

                                      myProcess->start(exe_path, arguments);
                                      

                                      My log by system monitor:

                                      • 16:50 4300 KB
                                      • 17:06 4790 KB
                                      • 17:20 5200 KB
                                      • 17:30 5552 KB

                                      Any ideas?

                                      KroMignon JonB 2 Replies Last reply Reply Quote 0
                                      • KroMignon
                                        KroMignon @sitesv last edited by KroMignon

                                        @sitesv said in Executing QProcess in QThread: memory leak:

                                        Made a simple test:

                                        You are aware that doing so (subclassing QThread and redefining slot run()), there will be not QEventLoop to handle signals/slots for all QObjects running in this thread?
                                        For example QTimer::singleShot() will not work.

                                        It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                                        1 Reply Last reply Reply Quote 1
                                        • JonB
                                          JonB @sitesv last edited by JonB

                                          @sitesv
                                          In addition, from @KroMignon no QEventLoop also means no deleting/disposing/freeing of Qt objects.

                                          On a side note: nothing to do with your findings, but for the record

                                           arguments << "127.0.0.1" << "-c 1";
                                          

                                          is wrong: -c & 1 are separate arguments, it ought to be << "-c" << "1". You are lucky it works as one argument.

                                          sitesv 1 Reply Last reply Reply Quote 1
                                          • sitesv
                                            sitesv last edited by

                                            @KroMignon @JonB
                                            Are there any methods to do this correctly?
                                            If I do this in the main thread: the app will freeze while QProcess execution - this is unacceptable for me.

                                            KroMignon 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post