【问题标题】:How to set Thread specific breakpoints in Xcode?如何在 Xcode 中设置线程特定的断点?
【发布时间】:2010-12-08 10:18:29
【问题描述】:

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

【问题讨论】:

    标签: iphone multithreading cocoa-touch xcode breakpoints


    【解决方案1】:

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

    b -[UIView layoutSubviews] thread 2
    

    (您使用 gdb“信息线程”命令查看存在哪些线程以及 gdb 为它们使用的标识符)。

    我认为没有办法为每个线程设置断点除了主线程(线程 1),但如果你有合理数量的线程,你可以为每个线程设置断点如有必要,请单独使用。


    更新:

    如果由于 GCD 而无法解决每个线程的问题,您可以采取的另一种方法是设置一个常规断点,并为该断点设置 gdb 命令以转储回溯(“where”)和然后“继续”。

    【讨论】:

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

    a very useful bit of code 完全符合您的要求。它也比使用断点快得多。它通过调配一些 UIKit 方法(setNeedsLayout、setNeedsDisplay 等)的方法来实现这一点,并在主线程以外的线程上调用任何方法时抛出一个断言。

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

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2012-11-28
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多