[Bug]: QSProcessMonitor crashes Quicksilver
Opened this issue ยท 12 comments
Before submitting your bug report, please confirm you have completed the following steps
- Searched the issue is not already listed in the Issue List (I've searched it)
- Searched in the Quicksilver Users' Group for questions relating to tech support.
- Downloaded the latest version of Quicksilver for your system and confirmed the issue still persists.
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
My
Steps to reproduce
- Start QS
- Enable
Running Applications & Processes
inSettings
->Catalog
->Applications
- Wait a few minutes to hours
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:
#1 0x0000000184f77d90 in -[__NSDictionaryM objectForKey:] ()
#2 0x0000000105efa56c in -[QSObject _safeObjectForType:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject.m:416
#3 0x0000000105efa610 in -[QSObject objectForType:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSObject.m:429
#4 0x0000000105f2a6a0 in __54-[QSProcessMonitor processObjectWithPSN:fromSnapshot:]_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:207
#5 0x0000000184f98904 in __NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__ ()
#6 0x0000000184fbe2f0 in __NSDictionaryEnumerate ()
#7 0x0000000105f2a538 in -[QSProcessMonitor processObjectWithPSN:fromSnapshot:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:206
#8 0x0000000105f2a33c in -[QSProcessMonitor processObjectWithPSN:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:195
#9 0x0000000105f2b240 in -[QSProcessMonitor appTerminated:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:313
#10 0x0000000105f29be4 in __appTerminated_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSProcessMonitor.m:103
Screenshots
No response
Additional info
No response
Seem to have just had a crash at
, 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:
- the link to the actions run: https://github.com/quicksilver/Quicksilver/actions/runs/9339327722
- direct link to the build artifact, which will expire in a month or two IIRC; click this to download a debug version of QS with some relevant updates for the QSProcessMonitor crashes: https://github.com/quicksilver/Quicksilver/actions/runs/9339327722/artifacts/1560325997
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: #2990 (comment)
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
#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
#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 !
EDIT:
Fixed by configuration. Issue was I had a Trigger to launch a specific app upon wake, but meanwhile the app got removed and forgot to remove the trigger. The fact that quicksilver was occasionally crashing might still be a bug, but not critical for me.
ORIGINAL POST:
Thanks @n8henrie for picking this up.
Random background crashes still persist.
For me started 2 days ago, for no clear reason, on a previous version. Updated to v2.4.3 still crashing, 15 times in 2 days. Meanwhile I installed v2.4.3:Debug (4042)
I'm running MacOS Monterey 12.7.1 on Macbook Air M1
Other things I observed while analyzing crash reports in Console.app
- 5 out of 15 crash reports: "Time Since Wake: 1 seconds"
- All crash reports fired round number of seconds from boot: "Time Awake Since Boot: 84000 seconds" - always at least two zeroes (***00)
- Application Specific Information: abort() called
Attaching last crash report
Untitled.txt
Any other info I should deliver?
FWIW, I'm on Sonoma (14.5), and QS 2.4.3 has been stable for me. My laptop's current uptime is 19 days, and QS hasn't crashed in that time.