【问题标题】:Swift Xcode 11 breakpoints for conditionals do not workSwift Xcode 11 条件断点不起作用
【发布时间】:2020-01-27 23:58:16
【问题描述】:

我正在尝试在 XCode 中添加符号断点以检查后台线程上的 UI 引擎修改。

我正在做的事情如下:

但是,我得到的错误信息总是:

Stopped due to an error evaluating condition of breakpoint 5.1: "!Thread.isMainThread"
Couldn't parse conditional expression:
error: use of undeclared identifier 'Thread'

UI Engine must be modified on main thread.

我不明白为什么断点条件无法评估我的条件。有人可以解释我在这里可能做错了什么吗?我也试过把它放在 Obj-c 中,但没有成功。

编辑:Obj-C 版本,这里:!(BOOL)[NSThread isMainThread]

编辑 2:Xcode 版本 11.3 (11C29)

编辑 3:好的,所以,关闭 XCode 并重新打开已经让 Obj-C 版本“工作”,他们在断点处暂停,每次 4-5 分钟。这有效地使这些断点不可用。不知道如何解决。

【问题讨论】:

  • 我们可以看看你的条件的 ObjC 版本吗?
  • @matt 添加了编辑
  • 我可以通过将它写成(BOOL)[NSThread isMainThread] == NO来让它工作。
  • @matt 从技术上讲,你的回答解决了我原来的问题,所以如果你想让它成为一个实际的答案,我可以选择它,从而产生我将进一步研究的当前编辑 3,如果我无法解决,将在stackoverflow上发一篇关于的新帖子
  • 是的,我听说过“在断点处暂停很长时间”的问题——之前在 SO 上被问到过——但我自己从未见过,也没有研究过解决它。我认为这是一个完全不同的问题(当然我可能是错的)。

标签: swift xcode breakpoints


【解决方案1】:

通过将条件编写为

,我能够使您的原始符号断点按预期工作
(BOOL)[NSThread isMainThread] == NO

我怀疑有更好的方法,将 BOOL 直接与 NO 进行比较是非常糟糕的风格,但至少它让我通过了“不工作”阶段到“工作”阶段。

【讨论】:

    【解决方案2】:

    为了澄清,设置符号断点和使用条件确实有效,但是 我会冒险 self 和 Thread 不能用作 UIKit 框架的大部分符号,因为其中大部分都没有可用的调试信息,因此错误:使用未声明的标识符“线程”。

    在这篇文章中查看答案:

    How to log out self when add a symbol breakpoint at -[UIViewController viewWillAppear] method

    这里还有关于为子类创建符号断点和使用objective-c条件的可能解决方法的附加信息:

    Using of symbolic breakpoints for child classes in Xcode?

    话虽如此,如果您只对调用该方法(layoutSubviews)的模块中的特定类感兴趣,则可以在符号断点内指定模块,并且如果您有自己的该方法的实现(例如,您已在您的类代码中覆盖它),条件 Thread.isMainThread 或 !Thread.isMainThread 实际上将适用于该类。

    我知道这实际上可能无法解决您的困境,特别是如果您需要检查 layoutSubviews 的所有调用,但我希望它至少有助于解释为什么使用 Thread 的条件不能一直有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-29
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2015-10-17
      • 2012-11-16
      相关资源
      最近更新 更多