[Qt-creator] Help debugging a heap error

Murphy, Sean smurphy at walbro.com
Thu Jun 5 22:22:05 CEST 2014


> > I did get rid of the segfault by removing: serPort->deleteLater();
> > from my MainWindow destructor.
> 
> Ok, that's expected, as this avoids the second deletion.

So the only thing I can see that is related between my serial port object (since getting rid of the serPort->deleteLater() call seems to fix things) and a QAction object is that I've got some QAction signals connected to slots in that serial port object.  So does that make sense that the backtrace might show an issue in the QAction destructor?  I'm guessing maybe that as the QAction is getting destroyed, it's trying to disconnect all of its signals, but because the serial port object is already gone, it's causing a problem?  Otherwise, I'm a little stumped since I never explicitly delete any of the QAction objects, I just let the QObject parent/child system take care of this.

I originally had put the deleteLater() call in my destructor because in my constructor I had:
    serialPortThread = new QThread(this);
    serPort = new ECMSerialPort();  // <- unparented since otherwise moveToThread() fails
    serPort->moveToThread(serialPortThread);
    serialPortThread->start();
So I assumed that serPort was unparented at this point, and I would need to explicitly delete it at some point?  Does moveToThread() reparent the object from null to become a child of the QThread object?  Otherwise it seems like I'm leaving that object behind when the application quits.

> Is your code accessible somewhere?

Unfortunately, no.  It's proprietary code, so I can't put all of it up on github.  I can try to include snippets if you need to see them, but there's probably parts I would have to edit out, so at some point what I post there will be different enough that it might not be a good representation of the actual code.

> > But I think my real question right now is, how can I use QtCreator's
> > debugging setup to help track this down?
> 
> What's easiest/quickest depends a bit on your exact setup.
> 
> If your application can be compiled on Linux, then the quickest would be to
> run it under valgrind, either from the command line or within Creator by
> using Analyze->Valgrind Analyzer. The result would directly point you to both
> deallocations (something like "Invalid free at <address2> file2.cpp:123,
> address is inside a free'd block at <address1> file1.cpp:456")

I haven't tried to compile it under Linux.  In theory, I'm not doing anything that should be platform specific, so I think this might be possible.  I'll see if I have time to make this happen.

> Otherwise, you could try to set a breakpoint on the QAction::~QAction()
> destructor. If that works (might not, depending on you Qt build), repeated
> <F5> gives you one the destruction of one QAction per iteration, if the
> application is not overly big, spotting a duplicate "manually" might be
> possible.

When I run the application in debug mode in QtCreator, and just let it break on its own, I get the following stack dump.  In this dump, only lines 26 & 27 are black, all the other lines are greyed out and I can't step into them.  So I'm guessing that means I'm running with a release version of Qt, not debug?  If that's the case, what would I need to do to make QtCreator use the debug versions of Qt?  I used this installer to get Qt, qt-windows-opensource-5.2.0-mingw48_opengl-x86-offline.exe, so maybe I don't even have the source code?  A quick search on my machine doesn't find a qaction.cpp file anywhere, so that might explain why I can't step into that code!
0	ntdll!TpWaitForAlpcCompletion	C:\windows\system32\ntdll.dll		0x77410575	
1	??			0x28f7d8	
2	ntdll!AlpcMaxAllowedMessageLength	C:\windows\system32\ntdll.dll		0x773ca412	
3	??			0x157d3e68	
4	ntdll!RtlReleasePebLock	C:\windows\system32\ntdll.dll		0x773735b7	
5	??			0x9	
6	??			0x8	
7	??			0x28f8a0	
8	ntdll!LdrLoadAlternateResourceModuleEx	C:\windows\system32\ntdll.dll		0x773734a2	
9	??			0x157d3eb0	
10	ntdll!RtlValidateHeap	C:\windows\system32\ntdll.dll		0x7741172e	
11	??			0x13fb0000	
12	ntdll!AlpcMaxAllowedMessageLength	C:\windows\system32\ntdll.dll		0x773cac29	
13	??			0x13fb0000	
14	ntdll!LdrLoadAlternateResourceModuleEx	C:\windows\system32\ntdll.dll		0x773734a2	
15	??			0x157d3eb0	
16	msvcrt!free	C:\windows\syswow64\msvcrt.dll		0x75e798cd	
17	??			0x13fb0000	
18	QWidgetAction::~QWidgetAction	qwidgetaction.cpp	130	0xa8b54a8	
19	QObjectPrivate::deleteChildren	qobject.cpp	1835	0x6b941c3f	
20	QWidget::~QWidget	qwidget.cpp	1486	0xa89ec02	
21	QToolBar::~QToolBar	qtoolbar.cpp	570	0xaa1b1ab	
22	QToolBar::~QToolBar	qtoolbar.cpp	582	0xaa1b1d9	
23	QObjectPrivate::deleteChildren	qobject.cpp	1835	0x6b941c3f	
24	QWidget::~QWidget	qwidget.cpp	1486	0xa89ec02	
25	QMainWindow::~QMainWindow	qmainwindow.cpp	378	0xa9c47fe	
26	MainWindow::~MainWindow	mainwindow.cpp	249	0x404f16	
27	qMain	main.cpp	8	0x40168e	
28	WinMain at 16	qtmain_win.cpp	131	0x43a2fd	
29	main			0x469a5d	

Thanks, 
Sean



More information about the Qt-creator mailing list