我们的应用程序有一个相当标准的布局——一个带有工具栏的主窗口、左侧的源列表和一个选项卡控件。选项卡的内容由开源且非常复杂的第三方组件绘制。它广泛使用线程等。
一些用户可以可靠地重现整个应用程序“冻结”的情况 - 也就是说,主窗口停止重绘。光标不会抢滩,用户仍然可以四处点击,但窗口根本不会更新。
除了开始使用应用程序、打开一个或多个选项卡并在几分钟内出现问题外,没有特定的重现步骤。
他们能够在屏幕顶部打开应用程序菜单。其中一个菜单项 - “检查更新” - 启动模式会话(带有进度指示器的工作表),同时检查后台线程上的更新。
当应用程序处于这种“冻结”状态时,选择“检查更新”似乎会在模式会话期间解冻应用程序。冻结时进行的单击和按钮按下会突然注册为 UI 重绘。
然后,“检查更新”完成,模式会话结束,应用程序再次冻结。
在我看来,运行循环有问题。这是一个开放式问题,但老实说,我不知道去哪里找——什么会导致这些症状?我看不到遇到此问题的用户的硬件/软件之间有任何关联。
编辑
冻结后,我在控制台上看到的唯一我无法解释的是
12/18/2013 10:39:29.000 AM kernel[0]: Network delay is not specified! Defaulting to 0x384
但我认为这是一个红鲱鱼。
冻结时的过程示例为 UI 线程显示了这一点:
+ 2327 -[NSApplication run] (in AppKit) + 727 [0x9392e35c]
+ 2327 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] (in AppKit) + 119 [0x9393bad0]
+ 2327 _DPSNextEvent (in AppKit) + 1602 [0x9393c5a9]
+ 2327 _BlockUntilNextEventMatchingListInModeWithFilter (in HIToolbox) + 92 [0x9b2ea98d]
+ 2327 ReceiveNextEventCommon (in HIToolbox) + 526 [0x9b2eabb2]
+ 2327 RunCurrentEventLoopInMode (in HIToolbox) + 259 [0x9b2eae2d]
+ 2327 CFRunLoopRunInMode (in CoreFoundation) + 123 [0x95467bbb]
+ 2327 CFRunLoopRunSpecific (in CoreFoundation) + 394 [0x95467d5a]
+ 2324 __CFRunLoopRun (in CoreFoundation) + 1393 [0x95468541]
+ ! 2324 __CFRunLoopServiceMachPort (in CoreFoundation) + 169 [0x95468f69]
+ ! 2324 mach_msg (in libsystem_kernel.dylib) + 68 [0x99c0616c]
+ ! 2324 mach_msg_trap (in libsystem_kernel.dylib) + 10 [0x99c06f7a]
+ 3 __CFRunLoopRun (in CoreFoundation) + 1779 [0x954686c3]
+ 1 __CFRunLoopDoTimers (in CoreFoundation) + 222 [0x9552b22e]
+ : 1 CFArrayCreateMutable (in CoreFoundation) + 138 [0x9540a02a]
+ : 1 -[__NSPlaceholderArray initWithCapacity:] (in CoreFoundation) + 136 [0x954005a8]
+ : 1 +[__NSArrayM __new:::::] (in CoreFoundation) + 798 [0x9540096e]
+ 1 __CFRunLoopDoTimers (in CoreFoundation) + 237 [0x9552b23d]
+ : 1 CFArrayAppendValue (in CoreFoundation) + 157 [0x9541fa9d]
+ : 1 -[__NSArrayM addObject:] (in CoreFoundation) + 64 [0x954009e0]
+ : 1 -[__NSArrayM insertObject:atIndex:] (in CoreFoundation) + 400 [0x95400b90]
+ : 1 _platform_bzero$VARIANT$sse42 (in libsystem_platform.dylib) + 51 [0x9660c233]
+ 1 __CFRunLoopDoTimers (in CoreFoundation) + 349 [0x9552b2ad]
+ 1 __CFRunLoopDoTimer (in CoreFoundation) + 1395 [0x954b0b43]
+ 1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ (in CoreFoundation) + 22 [0x954b1186]
+ 1 WebCore::timerFired(__CFRunLoopTimer*, void*) (in WebCore) + 64 [0x9285bff0]
+ 1 WebCore::ThreadTimers::sharedTimerFired() (in WebCore) + 84 [0x9285c064]
+ 1 WebCore::ThreadTimers::sharedTimerFiredInternal() (in WebCore) + 330 [0x9285c1ca]
+ 1 WebCore::MainThreadSharedTimer::setFireInterval(double) (in WebCore) + 21 [0x9285ba65]
+ 1 WebCore::setSharedTimerFireInterval(double) (in WebCore) + 173 [0x9285bb1d]
+ 1 CFRunLoopAddTimer (in CoreFoundation) + 453 [0x9546fed5]
+ 1 CFSetApplyFunction (in CoreFoundation) + 147 [0x954554d3]
+ 1 CFBasicHashApply (in CoreFoundation) + 122 [0x95437b4a]
+ 1 __CFSetApplyFunction_block_invoke (in CoreFoundation) + 25 [0x95455519]
+ 1 __CFRunLoopAddItemToCommonModes (in CoreFoundation) + 60 [0x9545556c]
但我无法解释这些信息......
编辑 2
一个额外的样本;与第一个明显不同:
+ 2352 -[NSApplication run] (in AppKit) + 727 [0x9887035c]
+ 2352 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] (in AppKit) + 119 [0x9887dad0]
+ 2352 _DPSNextEvent (in AppKit) + 1602 [0x9887e5a9]
+ 2352 _BlockUntilNextEventMatchingListInModeWithFilter (in HIToolbox) + 92 [0x9428298d]
+ 2352 ReceiveNextEventCommon (in HIToolbox) + 526 [0x94282bb2]
+ 2352 RunCurrentEventLoopInMode (in HIToolbox) + 259 [0x94282e2d]
+ 2352 CFRunLoopRunInMode (in CoreFoundation) + 123 [0x930d6bbb]
+ 2352 CFRunLoopRunSpecific (in CoreFoundation) + 394 [0x930d6d5a]
+ 2332 __CFRunLoopRun (in CoreFoundation) + 1393 [0x930d7541]
+ ! 2332 __CFRunLoopServiceMachPort (in CoreFoundation) + 169 [0x930d7f69]
+ ! 2332 mach_msg (in libsystem_kernel.dylib) + 68 [0x91bc316c]
+ ! 2332 mach_msg_trap (in libsystem_kernel.dylib) + 10 [0x91bc3f7a]
+ 17 __CFRunLoopRun (in CoreFoundation) + 1779 [0x930d76c3]
+ ! 16 __CFRunLoopDoTimers (in CoreFoundation) + 349 [0x9319a2ad]
+ ! : 10 __CFRunLoopDoTimer (in CoreFoundation) + 1395 [0x9311fb43]
+ ! : | 10 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ (in CoreFoundation) + 22 [0x93120186]
+ ! : | 4 __NSFireTimer (in Foundation) + 117 [0x96cac78b]
+ ! : | + 4 -[ThirdPartyView nsTimerCallBack:] (in ThirdPartyLib) + 61 [0x24958bd]
+ ! : | + 1 -[NSPasteboard changeCount] (in AppKit) + 19 [0x98a44fc6]
+ ! : | + ! 1 CFPasteboardGetGenerationCount (in CoreFoundation) + 0 [0x930e3470]
+ ! : | + 1 -[NSPasteboard changeCount] (in AppKit) + 0 [0x98a44fb3]
+ ! : | + 1 DYLD-STUB$$CFPasteboardGetGenerationCount (in AppKit) + 0 [0x992f994c]
+ ! : | + 1 objc_msgSend (in libobjc.A.dylib) + 26 [0x9b1094aa]
+ ! : | 3 __NSFireTimer (in Foundation) + 164 [0x96cac7ba]
+ ! : | + 3 _CFAutoreleasePoolPop (in CoreFoundation) + 47 [0x9309bcdf]
+ ! : | + 3 (anonymous namespace)::AutoreleasePoolPage::pop(void*) (in libobjc.A.dylib) + 559 [0x9b10b4b7]
+ ! : | 2 __NSFireTimer (in Foundation) + 98 [0x96cac778]
+ ! : | + 2 ??? (in <unknown binary>) [0x3589ca0]
+ ! : | + 2 ??? (in <unknown binary>) [0x99575bc]
+ ! : | + 2 ??? (in <unknown binary>) [0x9957668]
+ ! : | + 1 _objc_rootRetainCount (in libobjc.A.dylib) + 88 [0x9b10bdd0]
+ ! : | + ! 1 objc::DenseMapBase<objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*> >, objc_object*, unsigned long, objc::DenseMapInfo<objc_object*>, true>::find(objc_object* const&) (in libobjc.A.dylib) + 32 [0x9b11f820]
+ ! : | + ! 1 bool objc::DenseMapBase<objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*> >, objc_object*, unsigned long, objc::DenseMapInfo<objc_object*>, true>::LookupBucketFor<objc_object*>(objc_object* const&, std::__1::pair<objc_object*, unsigned long> const*&) const (in libobjc.A.dylib) + 73 [0x9b11f9ff]
+ ! : | + 1 objc_msgSend (in libobjc.A.dylib) + 64 [0x9b1094d0]
+ ! : | 1 __NSFireTimer (in Foundation) + 53 [0x96cac74b]
+ ! : | 1 NSPushAutoreleasePool (in Foundation) + 0 [0x96c4a188]
+ ! : 4 __CFRunLoopDoTimer (in CoreFoundation) + 557 [0x9311f7fd]
+ ! : | 3 __CFArmNextTimerInMode (in CoreFoundation) + 773 [0x930df535]
+ ! : | + 3 mk_timer_arm (in libsystem_kernel.dylib) + 10 [0x91bc40ca]
+ ! : | 1 __CFArmNextTimerInMode (in CoreFoundation) + 554 [0x930df45a]
+ ! : | 1 __CFTSRToNanoseconds (in CoreFoundation) + 25 [0x931bedb9]
+ ! : 1 __CFRunLoopDoTimer (in CoreFoundation) + 1556 [0x9311fbe4]
+ ! : | 1 pthread_mutex_lock (in libsystem_pthread.dylib) + 16 [0x911ca7ac]
+ ! : | 1 _pthread_mutex_lock (in libsystem_pthread.dylib) + 181 [0x911ca866]
+ ! : 1 __CFRunLoopDoTimer (in CoreFoundation) + 2093 [0x9311fdfd]
+ ! : 1 __CFRunLoopFindMode (in CoreFoundation) + 174 [0x930b1b5e]
+ ! : 1 _CFRuntimeSetInstanceTypeIDAndIsa (in CoreFoundation) + 33 [0x93065711]
+ ! : 1 _CFRuntimeSetInstanceTypeID (in CoreFoundation) + 0 [0x93063f50]
+ ! 1 __CFRunLoopDoTimers (in CoreFoundation) + 237 [0x9319a23d]
+ ! 1 CFArrayAppendValue (in CoreFoundation) + 157 [0x9308ea9d]
+ ! 1 -[__NSArrayM addObject:] (in CoreFoundation) + 64 [0x9306f9e0]
+ ! 1 -[__NSArrayM insertObject:atIndex:] (in CoreFoundation) + 400 [0x9306fb90]
+ ! 1 _platform_bzero$VARIANT$sse42 (in libsystem_platform.dylib) + 0 [0x94d2d200]
+ 2 __CFRunLoopRun (in CoreFoundation) + 1601 [0x930d7611]
+ ! 1 __CFRunLoopDoObservers (in CoreFoundation) + 81 [0x930e63b1]
+ ! : 1 CFArrayGetCount (in CoreFoundation) + 20 [0x930797f4]
+ ! 1 __CFRunLoopDoObservers (in CoreFoundation) + 194 [0x930e6422]
+ ! 1 CFArrayGetValueAtIndex (in CoreFoundation) + 0 [0x9308ef80]
+ 1 __CFRunLoopRun (in CoreFoundation) + 1550 [0x930d75de]
+ 1 mach_port_extract_member (in libsystem_kernel.dylib) + 31 [0x91bc7363]
+ 1 _kernelrpc_mach_port_extract_member_trap (in libsystem_kernel.dylib) + 10 [0x91bc3f26]