Iphone 如何在Xcode中设置特定于线程的断点?

Iphone 如何在Xcode中设置特定于线程的断点?,iphone,multithreading,cocoa-touch,xcode,breakpoints,Iphone,Multithreading,Cocoa Touch,Xcode,Breakpoints,我正在调试一个非主线程使用UIKit绘图方法的崩溃。我想在-[UIView layoutSubviews]上设置一个条件断点,如果它是在非主线程中执行的,那么它只会触发。这可能吗?您可以使用gdb控制台设置每个线程的断点。例如: b -[UIView layoutSubviews] thread 2 (您可以使用gdb“info threads”命令来查看存在哪些线程以及gdb使用哪些标识符) 我认为除了主线程(线程1)之外,没有办法为每个线程设置断点,但是如果有合理数量的线程,可以在必要时分

我正在调试一个非主线程使用UIKit绘图方法的崩溃。我想在
-[UIView layoutSubviews]
上设置一个条件断点,如果它是在非主线程中执行的,那么它只会触发。这可能吗?

您可以使用gdb控制台设置每个线程的断点。例如:

b -[UIView layoutSubviews] thread 2
(您可以使用gdb“info threads”命令来查看存在哪些线程以及gdb使用哪些标识符)

我认为除了主线程(线程1)之外,没有办法为每个线程设置断点,但是如果有合理数量的线程,可以在必要时分别为每个线程设置断点


更新:

如果由于GCD,每个线程的事情都不起作用,那么您可以采取的另一种方法是只设置一个常规断点,并为该断点设置gdb命令以转储回溯(“where”)然后“continue”

有一种方法可以完全满足你的要求。它也比使用断点快得多。它通过方法swizzling一些UIKit方法(setNeedsLayout、setNeedsDisplay等)并抛出断言(如果在主线程以外的线程上调用了任何断言)来实现这一点


它非常适合在开发过程中捕获这些类型的缺陷,但一定要记住将其从生产代码中删除。如果需要的话,适应AppKit也很简单。

谢谢您的回答!两个问题:执行速度大幅降低到完全静止状态是否正常?我已经在
-layoutSubviews
上创建了断点,正如您为我所有正在运行的线程所建议的那样,它们都没有被触发。其次,我不能为还不存在的线程设置断点,这对吗?这将使它在GCD的情况下变得非常无用,因为在GCD中线程是定期生成和结束的。好问题。我不知道,但我怀疑每线程断点机制的工作原理是设置一个常规断点,然后让gdb测试当前线程id(如果不是正确的线程,则静默继续);我知道那会变得多么昂贵。我不知道如何为不存在的线程设置断点。谢谢,您的回答很有帮助。我注意到Xcode不能很好地处理这些断点。在下一次启动应用程序时,它会再次添加这些断点,但不遵守线程参数。因此,断点对于所有线程都是活动的。尽管如此,在非主线程bug上查找那些讨厌的UIKit调用总比什么都没有好。看起来这在lldb中已经不起作用了。有人知道它的break命令语法吗?