【发布时间】:2010-12-08 10:18:29
【问题描述】:
我正在调试一个非主线程使用 UIKit 绘图方法的崩溃。我想在-[UIView layoutSubviews] 上设置一个条件断点,如果它在非主线程中执行,它只会触发。这可能吗?
【问题讨论】:
标签: iphone multithreading cocoa-touch xcode breakpoints
我正在调试一个非主线程使用 UIKit 绘图方法的崩溃。我想在-[UIView layoutSubviews] 上设置一个条件断点,如果它在非主线程中执行,它只会触发。这可能吗?
【问题讨论】:
标签: iphone multithreading cocoa-touch xcode breakpoints
您可以使用 gdb 控制台设置每个线程的断点。例如:
b -[UIView layoutSubviews] thread 2
(您使用 gdb“信息线程”命令查看存在哪些线程以及 gdb 为它们使用的标识符)。
我认为没有办法为每个线程设置断点除了主线程(线程 1),但如果你有合理数量的线程,你可以为每个线程设置断点如有必要,请单独使用。
更新:
如果由于 GCD 而无法解决每个线程的问题,您可以采取的另一种方法是设置一个常规断点,并为该断点设置 gdb 命令以转储回溯(“where”)和然后“继续”。
【讨论】:
-layoutSubviews 上创建了断点,正如您为我所有正在运行的线程所建议的那样,它们都没有触发。其次,我不能为尚不存在的线程设置断点是否正确?这在 GCD 的情况下会变得毫无用处,因为 GCD 会定期生成和结束线程。
a very useful bit of code 完全符合您的要求。它也比使用断点快得多。它通过调配一些 UIKit 方法(setNeedsLayout、setNeedsDisplay 等)的方法来实现这一点,并在主线程以外的线程上调用任何方法时抛出一个断言。
它非常适合在开发过程中捕捉这些类型的缺陷,但请务必记住将其从生产代码中删除。如果需要,适应 AppKit 也很简单。
【讨论】: