diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-15 12:03:20 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-17 13:31:59 +0200 |
commit | b6200de5d0894e63d58848e291f52a6ff98f3d9a (patch) | |
tree | 64a7d2e60987120308ca6b8f5a98dbac2abb9e41 /src/corelib/plugin/qlibrary.cpp | |
parent | cbd33cb55757122e2c02356285c335af969dcd43 (diff) |
Don't unload libraries on Darwin-based operating systems
We can't guarantee that the library didn't define Objective-C classes
that still have lingering references, resulting in warnings such as:
Attempt to use unknown class 0x10e52e110.
And possibly crashes such as:
thread #1, queue = 'com.apple.main-thread'
frame #0: 0x00007fff203829ee libsystem_kernel.dylib`__ulock_wait + 10
frame #1: 0x00007fff203fa0c5 libsystem_platform.dylib`_os_unfair_lock_lock_slow + 162
frame #2: 0x00007fff2026226b libobjc.A.dylib`unmap_image + 85
frame #3: 0x000000010001e11f dyld`dyld::removeImage(ImageLoader*) + 557
frame #4: 0x000000010002291d dyld`dyld::garbageCollectImages() + 956
frame #5: 0x000000010002e35d dyld`dlclose + 191
frame #6: 0x00007fff203cf1c9 libdyld.dylib`dlclose + 183
frame #7: 0x0000000103f9f2f1 libQt6Core_debug.6.dylib`QLibraryPrivate::unload_sys(this=0x000000011ba2c7d0) at qlibrary_unix.cpp:294:9
frame #8: 0x0000000103f93f3f libQt6Core_debug.6.dylib`QLibraryPrivate::unload(this=0x000000011ba2c7d0, flag=UnloadSys) at qlibrary.cpp:614:36
frame #9: 0x0000000103f971fb libQt6Core_debug.6.dylib`QLibraryStore::cleanup() at qlibrary.cpp:425:22
frame #10: 0x0000000103f970f9 libQt6Core_debug.6.dylib`qlibraryCleanup() at qlibrary.cpp:447:5
frame #11: 0x0000000103f970d1 libQt6Core_debug.6.dylib`(anonymous namespace)::qlibraryCleanup_dtor_class_::~qlibraryCleanup_dtor_class_(this=0x00000001041edd38) at qlibrary.cpp:449:1
frame #12: 0x0000000103f930f5 libQt6Core_debug.6.dylib`(anonymous namespace)::qlibraryCleanup_dtor_class_::~qlibraryCleanup_dtor_class_(this=0x00000001041edd38) at qlibrary.cpp:449:1
frame #13: 0x00007fff202e5d25 libsystem_c.dylib`__cxa_finalize_ranges + 316
frame #14: 0x00007fff202e6010 libsystem_c.dylib`exit + 53
frame #15: 0x00007fff203d1f44 libdyld.dylib`start + 8
frame #16: 0x00007fff203d1f3d libdyld.dylib`start + 1
thread #5, queue = 'com.apple.root.user-interactive-qos', stop reason = signal SIGABRT
frame #0: 0x00007fff203a356e libsystem_kernel.dylib`__abort_with_payload + 10
frame #1: 0x00007fff203a4fbd libsystem_kernel.dylib`abort_with_payload_wrapper_internal + 80
frame #2: 0x00007fff203a4f6d libsystem_kernel.dylib`abort_with_reason + 19
frame #3: 0x00007fff202749e3 libobjc.A.dylib`_objc_fatalv(unsigned long long, unsigned long long, char const*, __va_list_tag*) + 114
frame #4: 0x00007fff20274971 libobjc.A.dylib`_objc_fatal(char const*, ...) + 135
frame #5: 0x00007fff20255ccb libobjc.A.dylib`lookUpImpOrForward + 881
frame #6: 0x00007fff2025539b libobjc.A.dylib`_objc_msgSend_uncached + 75
frame #7: 0x00007fff22f368d6 AppKit`-[_NSWindowTransformAnimation setCurrentProgress:] + 42
frame #8: 0x00007fff22f37a8a AppKit`__55-[NSAnimation(NSInternal) _advanceTimeWithDisplayLink:]_block_invoke + 31
frame #9: 0x00007fff22d0774f AppKit`NSPerformVisuallyAtomicChange + 132
frame #10: 0x00007fff22f379dc AppKit`-[NSAnimation(NSInternal) _advanceTimeWithDisplayLink:] + 172
frame #11: 0x00007fff22e9a184 AppKit`-[NSScreenDisplayLink _fire] + 180
frame #12: 0x00007fff2362f0b4 AppKit`___NSRunLoopTimerCreateWithHandler_block_invoke + 34
frame #13: 0x00007fff204c6be9 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
frame #14: 0x00007fff204c66dd CoreFoundation`__CFRunLoopDoTimer + 927
frame #15: 0x00007fff204c623a CoreFoundation`__CFRunLoopDoTimers + 307
frame #16: 0x00007fff204ace13 CoreFoundation`__CFRunLoopRun + 1988
frame #17: 0x00007fff204abf8c CoreFoundation`CFRunLoopRunSpecific + 563
frame #18: 0x00007fff2123d607 Foundation`-[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 212
frame #19: 0x00007fff22f378f0 AppKit`-[NSAnimation(NSInternal) _runBlocking] + 453
frame #20: 0x00007fff22f376ae AppKit`__42-[NSAnimation(NSInternal) _runInNewThread]_block_invoke + 97
frame #21: 0x0000000104edb032 libdispatch.dylib`_dispatch_call_block_and_release + 12
frame #22: 0x0000000104edc264 libdispatch.dylib`_dispatch_client_callout + 8
frame #23: 0x0000000104ef04ac libdispatch.dylib`_dispatch_root_queue_drain + 828
frame #24: 0x0000000104ef0d3f libdispatch.dylib`_dispatch_worker_thread2 + 127
frame #25: 0x0000000104f7eac7 libsystem_pthread.dylib`_pthread_wqthread + 244
frame #26: 0x0000000104f7dae3 libsystem_pthread.dylib`start_wqthread + 15
This has been e.g. observed when a QNSWindow isn't closed and released
at application quit as expected. Although that is a corner case that
shouldn't happen, the general case is still valid.
Fixes: QTBUG-96208
Pick-to: 6.2 5.15
Change-Id: I6c9d220e6f5389707baf7ae983f3156e8e51c316
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/corelib/plugin/qlibrary.cpp')
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index ba682956c1..c6af4f9636 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -416,6 +416,11 @@ inline void QLibraryStore::cleanup() // see https://bugzilla.novell.com/show_bug.cgi?id=622977 // and http://sourceware.org/bugzilla/show_bug.cgi?id=11941 lib->unload(QLibraryPrivate::NoUnloadSys); +#elif defined(Q_OS_DARWIN) + // We cannot fully unload libraries, as we don't know if there are + // lingering references (in system threads e.g.) to Objective-C classes + // defined in the library. + lib->unload(QLibraryPrivate::NoUnloadSys); #else lib->unload(); #endif |