Swift Xcode 11 个条件断点不起作用

Swift Xcode 11 breakpoints for conditionals do not work

我正在尝试在 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 分钟,每次。这有效地使这些断点不可用。不确定如何解决这个问题。

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

查看此post中的答案:

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

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

也就是说,如果您只对调用该方法 (layoutSubviews) 的模块中的特定 classes 感兴趣,您可以在符号断点内指定模块,如果您有自己的模块该方法的实现(例如,您已在 class 代码中覆盖它),条件 Thread.isMainThread 或 !Thread.isMainThread 实际上适用于 class.

我知道这实际上可能无法解决您的困境,尤其是当您需要检查 layoutSubviews 的所有调用时,但我希望它至少有助于解释为什么使用 Thread 的条件并非始终有效。

通过将条件写为

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

我怀疑有更好的方法,将 BOOL 直接与 NO 进行比较是一种非常糟糕的方式,但至少它让我通过了 "doesn't work" 阶段,进入了 "does work" 阶段。