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

amb*_*ght 13 xcode breakpoints swift swift2

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

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

zrz*_*zka 23

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

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

不要将符号断点异常断点混合使用.不同的野兽.

回到你的问题......

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.)
Run Code Online (Sandbox Code Playgroud)

......这有点误导,因为抛出的错误不是例外.记住这一点.当你尝试在Xcode中设置异常断点时,没有Swift.可能主要原因是抛出的错误不是例外,他们也没有弄清楚到底在哪里(谁知道).

异常断点 - 编辑

手动添加

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

自动添加

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

断点br s -E swift

...当你想要停下来时,切换它(打开/关闭)throw.

符号断点

当你使用已经提到过的时候,br s -E swift你会发现它有符号throw.实际上它不是throw,但是swift_willThrow.随意以这种方式设置符号断点...

swift_willThrow符号断点

...我现在不推荐这种方式,因为将来可以更改.但如果它现在足够了,为什么不呢.

你可以在这样的Xcode项目中分享你的断点......

在此输入图像描述

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

当你遇到断点时,你最终会得到这样的东西......

断点击中了swift_willThrow

...并且您必须选择先前的堆栈帧以查看错误被抛出的位置...

扔堆栈框架


Max*_*mia 6

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

快速错误断点

如果右键单击新创建的断点,甚至可以指定Error要断开的特定符合类型.

自定义类型