0
votes

The following describes the issue and what I did to "correct" them. This runtime event required a few hours of time to resolve. As the site is one of my favorite sources of information, thought this might benefit someone.

I am sure this exception was created by my misunderstanding of QObjectCleanupHandler. Any constructive comments on a practical implementation of QObjectCleanupHandler would be appreciated.

-- Added QObjectCleanupHandler with QPointer<> to a MDI subwindow and a worker class.

  • run-DEBUG the application.

at the end of the run:

A dialog is raised with what appears to be assembly stack data.

Checked the debug log in QT Creator Menu: Windows\Views\Debugger Log\

Log Snippet:

Move to bottom

::::

Snippet:

Move to bottom

dState changed from InferiorRunRequested(10) to InferiorRunOk(11) [master] (1d84.1720): Access violation - code c0000005 (first chance) s sException at 0x67343a9c, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance) at c:\work\build\qt5_workdir\w\s\qtbase\src\corelib\kernel\qobject.cpp:2813 First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=03f160f1 ebx=00000000 ecx=03f3b728 edx=feeefeee esi=00000005 edi=00000000 eip=67343a9c esp=0046d1b8 ebp=0046d340 iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b
efl=00010202 Qt5Cored!QObject::disconnect+0x2bc: 2813 67343a9c 8b02 mov eax,dword ptr [edx] ds:002b:feeefeee=???????? s sException at 0x67343a9c, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance) dNOTE: INFERIOR SPONTANEOUS STOP sStopped. dState changed from InferiorRunOk(11) to InferiorStopOk(14) [master] Resolving symbol: Qt5Cored!QObject::disconnect...


Source Code Snippet responsible for the exception:

QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
trackObject(worker);
worker->movetothread(thread); 

trackObject() method is a private field on the QMdiSubWindow

class <form> 
{

 private:

   QObjectCleanupHandler trackObject(QObject obj);


::: etc.

Corrective Action:

Source Code Snippet Changed to:

QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
worker->movetothread(thread); 

/* removed all instances of QObjectCleanupHandler in all classes. */

QT Environment Defined in Exception: QT KernelBase!RaiseException at 0x759fc41f


1
That’s of limited usefulness without more context from your application and analysis what’s going on. To me the actual reason for the crash was probably that worker was accessed from two threads without protection, from the new thread it operates in and the (main) thread with the cleanup handler. Now it looks like you’re leaking thread and worker, so I’m unsure the issue is solved properly.Frank Osterfeld
I think you are right on with your assessment. I will investigate further locking of the thread resource as the pointer is inserted into a QList<QPointer<>> for all active threads and only after emitting finalize back to the main thread, the QThread object is removed from the QList. Perhaps I need to implement a lock When the thread is added to the pointer list. I will look at it. Thanks for the comment.Tim P

1 Answers

0
votes

I had the same issue once and it came out, that I had to restart QtCreator. After loading my project again, without changing anything in my code, I did not get that error anymore.