如何在所有抛出上设置断点?

How to set a breakpoint on all throws?

有什么方法可以指定断点以停止所有 'throw' 语句? (符号断点)

guard let id = UInt(idString),
      let changeset = UInt(changesetString),
      let uid = UInt(uidString)
else {
      throw OSMVectorMapDescriptionError.ElementAttributeConversionError(element: xmlNode, attributeº: nil)
}

首先要记住的是 Swift 中抛出的错误不是异常,只是错误(NSError,无论基于 ErrorType,...)。

第二件事是,不要使用 try! 除非你非常确定它不会崩溃,或者如果崩溃是你真正想要的。

不要混symbolic breakpoint with exception breakpoint。不同的野兽。

回到你的问题...

throw 不是符号,因此符号断点对您不起作用。但是有办法...

(lldb)br s -E swift

-E <language> ( --language-exception <language> )
  Set the breakpoint on exceptions thrown by the specified language
  (without options, on throw but not catch.)

... 这有点误导,因为抛出的错误不是异常。请记住这一点。当您尝试在 Xcode 中设置异常断点时,没有 Swift。可能主要原因是抛出的错误不是异常,他们还没有弄清楚把它放在哪里(谁知道)。

手动添加

在代码的某处设置断点,当执行暂停时,只需在 LLDB 提示符中键入 br s -E swift 然后继续。

自动添加

以这种方式在代码中的某处设置断点...

... 并在您确实想在 throw.

停止时切换它 (on/off)

符号断点

当您使用已经提到的 br s -E swift 时,您会发现 throw 的符号。其实不是throw,而是swift_willThrow。随意以这种方式设置符号断点...

...暂时不推荐这种方式,以后可以改。但如果现在足够了,为什么不呢。

您可以像这样在 Xcode 个项目中共享您的断点...

...二次点击,将断点移动到用户。断点将在所有 Xcode 个项目中可见。

当你遇到断点时,你会以这样的方式结束......

...而且您必须 select 之前的堆栈帧才能查看错误发生的位置...

刚刚在 Xcode 8.3 中找到了替代方案:菜单中有一个 "Swift Error Breakpoint" 选项用于添加新的临时断点:

如果您右键单击新创建的断点,您甚至可以指定特定的 Error 类型作为中断点。