My mac's UI is randomly freezing for 5-10 seconds throughout the day. How can I figure out what's going wrong?

Solution 1:

I have discovered how to determine the cause of the freezes. The trick is to take a sample of the system WindowServer process while it is frozen.

Of course, since I can't interact with the system while it's frozen, I used a separate computer to ssh into my mac, switch that session to the root account with sudo -s, and then execute the following command the moment the system freezes: sample WindowServer 5

That creates a sample that shows what the window server was stuck doing while it was frozen, and it consistently showed it locked in the following functions:

4613 Thread_1658: Main Thread   DispatchQueue_<multiple>
+ 4613 start  (in libdyld.dylib) + 1  [0x7fff71e563d5]
+   4613 ???  (in WindowServer)  load address 0x107900000 + 0x150d  [0x10790150d]
+     4613 SLXServer  (in SkyLight) + 1349  [0x7fff6b2b7af1]
+       4613 server_loop  (in SkyLight) + 602  [0x7fff6b2b7d52]
+         2238 CGXRunOneServicesPass  (in SkyLight) + 731  [0x7fff6b2b6df9]
+         ! 2236 mach_msg  (in libsystem_kernel.dylib) + 60  [0x7fff71f8b76c]
+         ! : 2236 mach_msg_trap  (in libsystem_kernel.dylib) + 10  [0x7fff71f8b22a]
+         ! 2 mach_msg  (in libsystem_kernel.dylib) + 60,68  [0x7fff71f8b76c,0x7fff71f8b774]
+         2087 CGXRunOneServicesPass  (in SkyLight) + 1761  [0x7fff6b2b71ff]
+         ! 2086 post_port_data  (in SkyLight) + 237  [0x7fff6b2b7551]
+         ! : 1986 rendezvousHandler(unsigned int, mach_msg_header_t*, void*)  (in SkyLight) + 29  [0x7fff6b138bd1]
+         ! : | 1984 CGXHandleMessage  (in SkyLight) + 101  [0x7fff6b2738bc]
+         ! : | + 1984 invocation function for block in rendezvousHandler(unsigned int, mach_msg_header_t*, void*)  (in SkyLight) + 125  [0x7fff6b138c5f]
+         ! : | +   1979 _XGetEventShmem  (in SkyLight) + 310  [0x7fff6b0837bd]
+         ! : | +   ! 1979 WSEventSourceCreateGraphShmemForAuditToken  (in SkyLight) + 82  [0x7fff6b1bccb5]
+         ! : | +   !   1978 WSAuditTokenCanMonitorEvents  (in SkyLight) + 171  [0x7fff6b2bab0d]
+         ! : | +   !   : 1978 WSAuditTokenIsPostEventTCCApprovedCachingFailure  (in SkyLight) + 320  [0x7fff6b2ba977]
+         ! : | +   !   :   1978 TCCAccessCheckAuditToken  (in TCC) + 269  [0x7fff6c788a9e]
+         ! : | +   !   :     1978 TCCAccessRequest  (in TCC) + 345  [0x7fff6c783e5d]
+         ! : | +   !   :       1978 _os_activity_initiate_impl  (in libsystem_trace.dylib) + 53  [0x7fff7206889c]
+         ! : | +   !   :         1978 _dispatch_lane_barrier_sync_invoke_and_complete  (in libdispatch.dylib) + 60  [0x7fff71e15129]
+         ! : | +   !   :           1978 _dispatch_client_callout  (in libdispatch.dylib) + 8  [0x7fff71e0963d]
+         ! : | +   !   :             1978 __TCCAccessRequest_block_invoke.68  (in TCC) + 862  [0x7fff6c784549]
+         ! : | +   !   :               1978 tccd_send_message  (in TCC) + 656  [0x7fff6c784c25]
+         ! : | +   !   :                 1978 xpc_connection_send_message_with_reply_sync  (in libxpc.dylib) + 178  [0x7fff72088647]
+         ! : | +   !   :                   1978 dispatch_mach_send_with_result_and_wait_for_reply  (in libdispatch.dylib) + 50  [0x7fff71e1d882]
+         ! : | +   !   :                     1978 _dispatch_mach_send_and_wait_for_reply  (in libdispatch.dylib) + 609  [0x7fff71e1d3e7]
+         ! : | +   !   :                       1978 mach_msg  (in libsystem_kernel.dylib) + 60  [0x7fff71f8b76c]
+         ! : | +   !   :                         1978 mach_msg_trap  (in libsystem_kernel.dylib) + 10  [0x7fff71f8b22a]

This is taken from a sample that caught two seconds of a freeze.

This pretty clearly shows that TCC is the culprit. Now that I know that, the next question is figuring out how to fix the freezes.