Uploaded image for project: 'Qt Solutions'
  1. Qt Solutions
  2. QTSOLBUG-188

Crash in QCoreApplication::arguments() when QtService started from command line in Windows

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • Not Evaluated
    • None
    • No Version
    • Service
    • None
    • Windows 7, Qt 5.2.1/5.4.2. MSVC2010, Latest QtService from git.

    Description

      If you have this test case:

      #include "service.h"
      
      #include <QDebug>
      #include <QThread>
      
      Service::Service(int argc, char *argv[])
          : QtService<QCoreApplication>(argc, argv, "test-service") {
      
      }
      
      void Service::start() {
      
          qDebug("Started");
          QThread::sleep(20); //time to attach debugger
          qApp->arguments(); //crashes here when started from command line with -s
          qDebug("arguments() successfully called");
      }
      

      It will crash at qApp()->arguments() if you start it using cmd.exe:

      • Start -> cmd.exe -> RMB -> "Run as Administrator"
      • navigate to test-qtservice.exe (or whatever it is named)
      • execute "test-qtservice.exe -s"
      • Attach windbg or other debugger
      • Expect crash (after QThread::sleep())

      Backtrace:

      0020d5b8 66899d18 00610000 bcad895e 0056de10 Qt5Core!QString::clear+0x732
      0020d5f4 75663c01 756644a5 00004e20 0020d688 Qt5Core!QCoreApplication::arguments+0x178
      0020d5f8 756644a5 00004e20 0020d688 669331d1 KERNELBASE!SleepEx+0x91
      0020d60c 00e612ab 0020d628 00000014 0020d62c KERNELBASE!Sleep+0xf
      0020d63c 708c3205 0044b700 0044b6e8 668ba1e5 test_qtservice!Service::Service+0x5b [c:\users\vincas\code\tests\test-qtservice\service.cpp @ 8]
      0020d648 668ba1e5 0044b700 bcad8ace 0044b700 QtSolutions_Service_head!QtServiceBase::exec+0xb45
      0020d688 66934deb ffffffff 6689934d 0044b700 Qt5Core!QObject::event+0x1c5
      0020d6f4 66899565 0056e810 0044b700 bcad8b9e Qt5Core!std::_Init_locks::operator=+0x19ee8
      0020d754 668d5dd0 00000000 00000000 0056e810 Qt5Core!QCoreApplicationPrivate::sendPostedEvents+0x205
      0020d7c0 769b62fa 00150062 669f2330 00000000 Qt5Core!QEventDispatcherWin32::sendPostedEvents+0x10
      0020d864 769b77c4 00000000 668d69d0 00150062 USER32!gapfnScSendMessage+0x332
      0020d8c4 769b788a 668d69d0 00000000 0044bad0 USER32!CharPrevW+0x138
      0020f6a4 668965af 00000024 bcadaa22 00446ec0 USER32!DispatchMessageW+0xf
      0020f6f0 66899fb2 00000000 bcadab96 00446ec0 Qt5Core!QEventLoop::exec+0x11f
      0020f734 708c54ee bcadabde 00e63430 0020f7e0 Qt5Core!QCoreApplication::exec+0x192
      0020f77c 708c68b5 00000004 708c299a bcadab0e QtSolutions_Service_head!QtServiceController::start+0x75e
      0020f7d0 00e61119 bcacf9e5 00000001 00e621b0 QtSolutions_Service_head!QtServiceController::start+0x1b25
      0020f7d4 bcacf9e5 00000001 00e621b0 00441518 test_qtservice!main+0x9 [c:\users\vincas\code\tests\test-qtservice\main.cpp @ 6]
      0020f7f4 00e6151e 00000001 00441488 00441cb8 0xbcacf9e5
      0020f838 74df337a 7efde000 0020f884 76f792e2 test_qtservice!operator++0x3e [c:\qt\5.2.1\msvc2010\include\qtcore\qstring.h @ 1127]
      0020f884 76f792b5 00e6163f 7efde000 00000000 kernel32!BaseThreadInitThunk+0x12
      0020f89c 00000000 00e6163f 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36
      

      Looks like it's related with QTSOLBUG-184, which is marked as... done?

      This is inconsistency, as QtService started using Windows service manager works OK, though when started using command line "-s" switch - not.

      If I add OutputDebugString lines in qtservice_win.cpp:

          ...
          OutputDebugStringA(sys->serviceArgs.join(";").toLocal8Bit());
          OutputDebugStringW(GetCommandLineW());
      
          q_ptr->createApplication(argc, argv.data());
          QCoreApplication *app = QCoreApplication::instance();
          if (!app)
          ...
      

      ...I notice (using DbgView.exe) differences in command line when started from cmd.exe:

      test-service;-s
      C:\Users\Vincas\code\tests\test-qtservice\release\test-qtservice.exe
      

      So, sys->serviceArgs list contains two arguments: "test-service" and "-s", while GetCommandLine(), which is also used in QCoreApplication::arguments(), has only one. If service is started from services.msc, there are one argument in both cases, and there are no crash.

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            Unassigned Unassigned
            talkless Vincas Dargis
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes