Open n8henrie opened 6 months ago
Seem to have just had a crash at https://github.com/quicksilver/Quicksilver/blob/f4f679f3a9a0dc377214e150761ff633a9807a13/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m#L170, but XCode said it was "paused" -- unclear if I fat fingered something while it was running in the background.
For users thinking that this might be the cause of their crashes, consider disabling QSProcessMonitor in your settings by going to: Preferences
-> Catalog
-> Applications
and unchecking Running Applications & Processes
Hi all,
I made a few related changes in the process-monitor-crashes branch, and it seems to be running much more stably for me.
If anyone would be willing to try out a debug version with these changes, I'd appreciate the feedback, I'll probably merge and cut a new release in a week or so if things seem improved:
EDIT:
NB: This is a pre-release version that is not signed, so you'll have to do a little dance to get MacOS to allow you to open the application; it usually involves multiple rounds of right-clicking (or two-finger tapping) the application and choosing "open" followed by a dialog warning you about it being from an "unidentified developer": https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac
Looks like the same crash is still occurring: https://github.com/quicksilver/Quicksilver/issues/2990#issuecomment-2153738223
I'm still occasionally getting some of these EXC_BAD_ACCESS
crashes coming through QSProcessMonitor, in spite of converting things to use the threadsafedictionary. Would appreciate any input from @pjrobertson @skurfer or anyone more familiar with ObjC.
Just now, crash is at https://github.com/quicksilver/Quicksilver/blob/af772d58691fc54d9f41bdc1a7690c78dd0a6e3b/Quicksilver/Code-QuickStepCore/QSObject.m#L461
#0 0x000000019cee9c08 in objc_msgSend ()
#1 0x00000001032f7fb4 in -[QSThreadSafeMutableDictionary objectForKey:] ()
#2 0x00000001033c2d9c in -[QSObject objectForCache:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject.m:461
#3 0x00000001033cdac8 in -[QSObject(FileHandling) fileExtension] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject_FileHandling.m:831
#4 0x00000001033cd73c in -[QSObject(FileHandling) isClipping] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject_FileHandling.m:810
#5 0x00000001033cbf8c in +[QSObject(FileHandling) fileObjectWithPath:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject_FileHandling.m:631
#6 0x00000001033f243c in -[QSProcessMonitor imbuedFileProcessForDict:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:179
#7 0x00000001033f3f20 in -[QSProcessMonitor reloadProcesses] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:391
#8 0x00000001033f326c in -[QSProcessMonitor appLaunched:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:298
#9 0x00000001033f1d44 in __appLaunched_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:82
#10 0x0000000102cdcf2c in _dispatch_call_block_and_release ()
#11 0x0000000102cdeba4 in _dispatch_client_callout ()
#12 0x0000000102ce7d88 in _dispatch_lane_serial_drain ()
#13 0x0000000102ce8e7c in _dispatch_lane_invoke ()
#14 0x0000000102cf8958 in _dispatch_root_queue_drain_deferred_wlh ()
#15 0x0000000102cf7c30 in _dispatch_workloop_worker_thread ()
#16 0x000000010359bd40 in _pthread_wqthread ()
AFAICT cache
should be thread safe.
Well, I probably should have discovered Xcode's Address Sanitizer and Thread Sanitizer sooner. I still need to figure out how to use them and my superficial familiarity with ObjC is not helping, but it seems like it's a step in the right direction.
Thread Sanitizer identifies data races right where I've been getting crashes in QSThreadSafeMutableDictionary:
/Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepFoundation/QSThreadSafeMutableDictionary.m:107 Data race in -[QSThreadSafeMutableDictionary objectForKey:] at 0x10a08c920
Location is a 16-byte heap object at 0x10a08c920
Read of size 8 by thread 17
#0 0x0000000106c9be10 in -[QSThreadSafeMutableDictionary objectForKey:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepFoundation/QSThreadSafeMutableDictionary.m:107
#1 0x0000000106f56b70 in -[QSObject objectForCache:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject.m:461
#2 0x0000000106f6990c in -[QSObject(FileHandling) fileExtension] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject_FileHandling.m:831
#3 0x0000000106f69390 in -[QSObject(FileHandling) isClipping] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject_FileHandling.m:810
#4 0x0000000106f66b20 in +[QSObject(FileHandling) fileObjectWithPath:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject_FileHandling.m:631
#5 0x0000000106fa46bc in -[QSProcessMonitor imbuedFileProcessForDict:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:179
#6 0x0000000106fa753c in -[QSProcessMonitor reloadProcesses] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:391
#7 0x0000000106fa5f00 in -[QSProcessMonitor appLaunched:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:298
#8 0x0000000106fa3ac4 in __appLaunched_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:82
#9 0x00000001051a82e8 in __tsan::invoke_and_release_block(void*) ()
#10 0x00000001070aaba4 in _dispatch_client_callout ()
Write of size 8 by thread 21
#0 0x0000000106c9b260 in -[QSThreadSafeMutableDictionary initWithCapacity:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepFoundation/QSThreadSafeMutableDictionary.m:58
#1 0x000000018ba6cbd0 in -[NSMutableDictionary initWithObjects:forKeys:count:] ()
#2 0x0000000106f546c0 in -[QSObject copyWithZone:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject.m:293
#3 0x0000000106f47c54 in -[QSLibrarian typeArraysFromArray:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:527
#4 0x0000000106f46c88 in -[QSLibrarian recalculateTypeArraysForItem:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:463
#5 0x0000000106f45014 in -[QSLibrarian reloadSets:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:337
#6 0x000000018b98b144 in __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ ()
#7 0x0000000106f28a10 in -[QSCatalogEntry scanForced:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSCatalogEntry.m:719
#8 0x0000000106f43d9c in __28-[QSLibrarian reloadSource:]_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:273
#9 0x00000001051a82e8 in __tsan::invoke_and_release_block(void*) ()
#10 0x00000001070aaba4 in _dispatch_client_callout ()
Heap block allocated by thread 21
#0 0x000000010517e2d0 in wrap_calloc ()
#1 0x000000018b4e5d84 in _objc_rootAllocWithZone ()
#2 0x0000000106f546c0 in -[QSObject copyWithZone:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject.m:293
#3 0x0000000106f47c54 in -[QSLibrarian typeArraysFromArray:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:527
#4 0x0000000106f46c88 in -[QSLibrarian recalculateTypeArraysForItem:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:463
#5 0x0000000106f45014 in -[QSLibrarian reloadSets:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:337
#6 0x000000018b98b144 in __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ ()
#7 0x0000000106f28a10 in -[QSCatalogEntry scanForced:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSCatalogEntry.m:719
#8 0x0000000106f43d9c in __28-[QSLibrarian reloadSource:]_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:273
#9 0x00000001051a82e8 in __tsan::invoke_and_release_block(void*) ()
#10 0x00000001070aaba4 in _dispatch_client_callout ()
Adding my thread 2990 (before this one) here https://github.com/quicksilver/Quicksilver/issues/2990
Still crashing after debug images and updates.
I have disabled the Running Process catalog. Will revert back if/when the next crash occurs
v2.4.3 has been released and contains some relevant fixes. Can subscribers to this thread please update and report back?
I've upgraded. Thanks so much for your work, @n8henrie !
Before submitting your bug report, please confirm you have completed the following steps
Bug description
As per the title -- we have a number of crashes in QSProcessMonitor. This will be a meta-issue with links to a few relevant issues.
For example, I get a
EXC_BAD_ACCESS
at https://github.com/quicksilver/Quicksilver/blob/f4f679f3a9a0dc377214e150761ff633a9807a13/Quicksilver/Code-QuickStepCore/QSObject.m#L412My
Steps to reproduce
Running Applications & Processes
inSettings
->Catalog
->Applications
Expected behavior
No crash
MacOS Version
Other
Quicksilver Version
2.4.2
Relevant Plugins
No response
Crash Logs or Spindump
The callstack during a crash:
Screenshots
No response
Additional info
No response