[Interest] Debugging a double dealloc

Ben Haller bhaller at mac.com
Wed Sep 23 14:08:37 CEST 2020


Thanks for the suggestion.  However, this problem is only on macOS, and Valgrind doesn’t appear to run on any macOS later than 10.12 (“preliminary” support for 10.13, according to their website; I’m not sure what that means).  I’m on macOS 10.15.6, and I’m using Qt 5.14.2 which has a minimum macOS version of 10.13, so Valgrind seems to be a no-go for at least one reason, perhaps two reasons (depending on “preliminary”).

Are there other approaches?

Cheers,
-B.

Benjamin C. Haller
Messer Lab
Cornell University


> On Sep 23, 2020, at 7:55 AM, Crocker, William <William.Crocker at analog.com> wrote:
> 
> Valgrind.
> 
>> -----Original Message-----
>> From: Interest <interest-bounces at qt-project.org> On Behalf Of Ben Haller via
>> Interest
>> Sent: Wednesday, September 23, 2020 7:50 AM
>> To: qt qt <interest at qt-project.org>
>> Subject: [Interest] Debugging a double dealloc
>> 
>> [External]
>> 
>> Hi all.  I’m trying to figure out what appears to be a double dealloc problem of some
>> sort.  I’m sure the actual bug is in my code (I’m trying to get a window with complex
>> subsidiary windows, etc., to disassemble and free the things it owns, without freeing
>> itself), but the backtrace at the point that the crash happens doesn’t have any of my
>> code in it at all.  I’ve appended the full backtrace below my signature, in case it is
>> informative; maybe somebody has seen this pattern before and knows what I’m
>> likely to be doing wrong.  My code does not use QFontCache or QScopedPointer at
>> all, so it’s hard to guess where my bug might be.
>> 
>> My question, though, is bigger: how would folks here recommend debugging a
>> double dealloc in a Qt-based app, running under Qt Creator?  I’m coming from the
>> Cocoa/Xcode world, and in that world there’s a very nice tool called NSZombie: you
>> set a flag, and then whenever an object would be deallocated, it instead turns into an
>> NSZombie object that produces nice console logs if anybody ever tries to use that
>> memory as an object again.  But that’s for NSObject.  Is there something similar in
>> the Qt world, such that I could get a console log or a break in the debugger at the
>> point where a C++/Qt object that has been dealloced gets touched again?  Or if not,
>> how would you recommend approaching this?  Thanks for any help.
>> 
>> Cheers,
>> -B.
>> 
>> Benjamin C. Haller
>> Messer Lab
>> Cornell University
>> 
>> 
>> 1  QScopedPointer<QObjectData,
>> QScopedPointerDeleter<QObjectData>>::operator->() const
>> qscopedpointer.h                       118  0x10201b594
>> 2  decltype(fp.operator->()) qGetPtrHelper<QScopedPointer<QObjectData,
>> QScopedPointerDeleter<QObjectData>> const>(QScopedPointer<QObjectData,
>> QScopedPointerDeleter<QObjectData>> const&)
>> qglobal.h                              1133 0x10201b594
>> 3  QObject::d_func() const
>> qobject.h                              132  0x10201b594
>> 4  QObject::thread() const
>> qobject.cpp                            1512 0x10201b594
>> 5  QOpenGLVertexArrayObjectPrivate::destroy()
>> qopenglvertexarrayobject.cpp           212  0x101b21481
>> 6  QOpenGLVertexArrayObject::destroy()
>> qopenglvertexarrayobject.cpp           424  0x101b217cc
>> 7  QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
>> qopenglvertexarrayobject.cpp           392  0x101b217c3
>> 8  QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
>> qopenglvertexarrayobject.cpp           391  0x101b217b9
>> 9  QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
>> qopengltextureglyphcache.cpp           93   0x101b1cacd
>> 10 QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
>> qopengltextureglyphcache.cpp           88   0x101b1cbce
>> 11 QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
>> qopengltextureglyphcache.cpp           88   0x101b1cbc9
>> 12
>> QExplicitlySharedDataPointer<QFontEngineGlyphCache>::~QExplicitlySharedData
>> Pointer()
>> qshareddata.h                          184  0x101883c92
>> 13
>> QExplicitlySharedDataPointer<QFontEngineGlyphCache>::~QExplicitlySharedData
>> Pointer()
>> qshareddata.h                          184  0x101883c74
>> 14 QFontEngine::GlyphCacheEntry::~GlyphCacheEntry()
>> qfontengine.cpp                        1570 0x101883c74
>> 15 QFontEngine::GlyphCacheEntry::~GlyphCacheEntry()
>> qfontengine.cpp                        1569 0x101883c74
>> 16 void
>> std::allocator_traits<std::allocator<std::__list_node<QFontEngine::GlyphCacheEntry
>> , void
>> *>>>::__destroy<QFontEngine::GlyphCacheEntry>(std::integral_constant<bool,
>> false>, std::allocator<std::__list_node<QFontEngine::GlyphCacheEntry, void *>>&,
>> QFontEngine::GlyphCacheEntry *) memory                                 1732 0x101883c74
>> 17 void
>> std::allocator_traits<std::allocator<std::__list_node<QFontEngine::GlyphCacheEntry
>> , void
>> *>>>::destroy<QFontEngine::GlyphCacheEntry>(std::allocator<std::__list_node<QF
>> ontEngine::GlyphCacheEntry, void *>>&, QFontEngine::GlyphCacheEntry *)
>> memory                                 1595 0x101883c74
>> 18 std::__list_imp<QFontEngine::GlyphCacheEntry,
>> std::allocator<QFontEngine::GlyphCacheEntry>>::clear()
>> list                                   733  0x101883c74
>> 19 std::__list_imp<QFontEngine::GlyphCacheEntry,
>> std::allocator<QFontEngine::GlyphCacheEntry>>::~__list_imp()
>> list                                   712  0x101883c24
>> 20 std::list<QFontEngine::GlyphCacheEntry>::~list()
>> list                                   805  0x101883c24
>> 21 std::list<QFontEngine::GlyphCacheEntry>::~list()
>> list                                   805  0x101883c24
>> 22 QHashNode<void const *,
>> std::list<QFontEngine::GlyphCacheEntry>>::~QHashNode()
>> qhash.h                                147  0x101883c24
>> 23 QHashNode<void const *,
>> std::list<QFontEngine::GlyphCacheEntry>>::~QHashNode()
>> qhash.h                                147  0x101883c24
>> 24 QHash<void const *,
>> std::list<QFontEngine::GlyphCacheEntry>>::deleteNode2(QHashData::Node *)
>> qhash.h                                563  0x101883c24
>> 25 QHashData::free_helper(void ( *)(QHashData::Node *))
>> qhash.cpp                              572  0x101e5db39
>> 26 QHash<void const *,
>> std::list<QFontEngine::GlyphCacheEntry>>::freeData(QHashData *)
>> qhash.h                                603  0x10187a47b
>> 27 QHash<void const *, std::list<QFontEngine::GlyphCacheEntry>>::~QHash()
>> qhash.h                                250  0x10187a46f
>> 28 QHash<void const *, std::list<QFontEngine::GlyphCacheEntry>>::~QHash()
>> qhash.h                                250  0x10187a44f
>> 29 QFontEngine::~QFontEngine()
>> qfontengine.cpp                        277  0x10187a44f
>> 30 QCoreTextFontEngine::~QCoreTextFontEngine()
>> qfontengine_coretext.mm                215  0x105b7cf8e
>> 31 QCoreTextFontEngine::~QCoreTextFontEngine()
>> qfontengine_coretext.mm                215  0x105b7cf89
>> 32 QFontEngineMulti::~QFontEngineMulti()
>> qfontengine.cpp                        1782 0x101880039
>> 33 QFontEngineMulti::~QFontEngineMulti()
>> qfontengine.cpp                        1778 0x10188012e
>> 34 QFontEngineMulti::~QFontEngineMulti()
>> qfontengine.cpp                        1778 0x101880129
>> 35 QFontCache::clear()
>> qfont.cpp                              2861 0x1018762eb
>> 36 QFontCache::~QFontCache()
>> qfont.cpp                              2817 0x10187603c
>> 37 QFontCache::~QFontCache()
>> qfont.cpp                              2816 0x1018763ee
>> 38 QFontCache::~QFontCache()
>> qfont.cpp                              2816 0x1018763e9
>> 39 QThreadStorageData::set(void *)
>> qthreadstorage.cpp                     162  0x101e25777
>> 40 QGuiApplicationPrivate::~QGuiApplicationPrivate()
>> qguiapplication.cpp                    1694 0x1017ca490
>> 41 QApplicationPrivate::~QApplicationPrivate()
>> qapplication.cpp                       184  0x10116f81e
>> 42 QApplicationPrivate::~QApplicationPrivate()
>> qapplication.cpp                       184  0x10116f819
>> 43 QScopedPointerDeleter<QObjectData>::cleanup(QObjectData *)
>> qscopedpointer.h                       60   0x10201c06c
>> 44 QScopedPointer<QObjectData,
>> QScopedPointerDeleter<QObjectData>>::~QScopedPointer()
>> qscopedpointer.h                       107  0x10201c061
>> 45 QScopedPointer<QObjectData,
>> QScopedPointerDeleter<QObjectData>>::~QScopedPointer()
>> qscopedpointer.h                       105  0x10201c05d
>> 46 QObject::~QObject()
>> qobject.cpp                            1119 0x10201c05d
>> 47 QApplication::~QApplication()
>> qapplication.cpp                       837  0x101171b3d
>> 48 main
>> main.cpp                               246  0x100012256
>> 49 start
>> (x86_64) /usr/lib/system/libdyld.dylib      0x7fff6b461cc9
>> 
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> https://lists.qt-project.org/listinfo/interest



More information about the Interest mailing list