关于堆栈溢出还有很多其他条目:
CoreAnimation: warning, deleted thread with uncommitted CATransaction
消息,并通过启用CA_DEBUG_TRANSACTIONS
对其进行排序。在我看到的99%的其他帖子中,回溯显示了未提交动画的来源(例如,参见Core Animation Warning: "uncommitted CATransaction",其中显示了在MyApp
中调用的函数)。
在我的情况下,我将CA_DEBUG_TRANSACTIONS
标志设置为1并且我得到了回溯,但不幸的是它没有告诉我它来自哪里:
Deallocating
CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
0 QuartzCore 0x00007fff95f8c76a _ZN2CA11Transaction4pushEv + 312
1 QuartzCore 0x00007fff95f8c60a _ZN2CA11Transaction15ensure_implicitEv + 276
2 QuartzCore 0x00007fff95f916f5 _ZN2CA5Layer13thread_flags_EPNS_11TransactionE + 37
3 QuartzCore 0x00007fff95f91642 _ZN2CA5Layer4markEPNS_11TransactionEjj + 64
4 QuartzCore 0x00007fff95f931df _ZN2CA5Layer25set_needs_display_in_rectERK6CGRect + 315
5 AppKit 0x00007fff97e7ebdd _NSBackingLayerSetNeedsDisplayInRect + 319
6 QuartzCore 0x00007fff95f93081 -[CALayer setNeedsDisplay] + 62
7 AppKit 0x00007fff97e7ea77 -[NSView(NSInternal) _setLayerNeedsDisplayInViewRect:] + 648
8 AppKit 0x00007fff98505049 NSViewSetNeedsDisplayInRect + 838
9 AppKit 0x00007fff97e13eed -[NSView setNeedsDisplay:] + 81
10 AppKit 0x00007fff97e2ddc0 -[_NSThemeWidget update] + 166
11 AppKit 0x00007fff980aa844 -[NSThemeFrame _updateButtonState] + 41
12 AppKit 0x00007fff98101fff -[NSWindow(NSSheets) _detachSheetWindow:] + 641
13 AppKit 0x00007fff98101a1a -[NSMoveHelper(NSSheets) _closeSheet:andMoveParent:] + 546
14 AppKit 0x00007fff9810178c -[NSWindow(NSSheets) _orderOutRelativeToWindow:] + 105
15 AppKit 0x00007fff97f232d7 -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 2833
不幸的是,代码库非常庞大,并且没有从我的代码库中看到原点,我不确定如何跟踪它。
有什么建议吗?
答案 0 :(得分:6)
我终于想出了一种方法,使用conditional breakpoints + symbolic breakpoints。
我会设定一个条件
![[NSThread currentThread] isMainThread]
编辑:似乎Xcode的不同版本以不同的方式处理条件。如果![[NSThread currentThread] isMainThread]
不起作用(您收到无法找到该符号的错误),请尝试![(NSThread*)[NSThread currentThread] isMainThread]
。
并将符号断点设置为回溯中显示的方法之一。基于我之前发布的回溯,符号断点可能是' - [NSView setNeedsDisplay:]'。
然后,一旦在非主线程上调用'[NSView setNeedsDisplay:]',我的断点就会被触发,我可以看到每个线程的状态,包括对调用者的回溯。这使我能够解决这个问题。
此外,请注意,此符号断点将极大地降低调试速度。我不建议让它一直运行。
答案 1 :(得分:2)
凯尔的答案是完美的,但我的Xcode版本(6.2)仍在抱怨条件![(NSThread*)[NSThread currentThread] isMainThread]
。
按照此Apple邮件列表消息中的建议: http://prod.lists.apple.com/archives/xcode-users/2015/Nov/msg00073.html
我使用了这个条件,这对我来说是正常的:
((BOOL)[(NSThread*)[NSThread currentThread] isMainThread]) == NO
(我没有足够的声誉发表评论,因此我发布了这个新答案)