删除的线程与未提交的CATransaction不显示源?

时间:2014-08-13 14:22:03

标签: macos cocoa appkit quartz-core

关于堆栈溢出还有很多其他条目: 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

不幸的是,代码库非常庞大,并且没有从我的代码库中看到原点,我不确定如何跟踪它。

有什么建议吗?

2 个答案:

答案 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

(我没有足够的声誉发表评论,因此我发布了这个新答案)