quicksilver / Quicksilver

Quicksilver Project Source
http://qsapp.com
Apache License 2.0
2.74k stars 286 forks source link

[Bug]: QSProcessMonitor crashes Quicksilver #3008

Open n8henrie opened 6 months ago

n8henrie commented 6 months ago

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#L412

My

Steps to reproduce

  1. Start QS
  2. Enable Running Applications & Processes in Settings -> Catalog -> Applications
  3. 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

n8henrie commented 6 months ago

Related issues:

n8henrie commented 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.

n8henrie commented 6 months ago

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

n8henrie commented 5 months ago

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

n8henrie commented 5 months ago

Looks like the same crash is still occurring: https://github.com/quicksilver/Quicksilver/issues/2990#issuecomment-2153738223

n8henrie commented 5 months ago

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.

n8henrie commented 4 months ago

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 ()
tangoTH commented 2 months ago

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

n8henrie commented 1 month ago

v2.4.3 has been released and contains some relevant fixes. Can subscribers to this thread please update and report back?

mrstanwell commented 1 month ago

I've upgraded. Thanks so much for your work, @n8henrie !