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

时间:2015-07-23 02:24:43

标签: swift xcode swift2 breakpoints

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

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

2 个答案:

答案 0 :(得分:23)

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

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

不要将symbolic breakpointexception 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。可能主要的原因是抛出的错误不是例外,他们也没有弄清楚把它放在哪里(谁知道)。

Exception breakpoint - Edit

手动添加

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

自动添加

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

Breakpoint br s -E swift

...并在您想要停在throw时切换(开/关)。

符号断点

当您使用已经提及的br s -E swift时,您将找到throw的符号。实际上它不是throw,而是swift_willThrow。随意以这种方式设置符号断点......

swift_willThrow symbolic breakpoint

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

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

enter image description here

...辅助点击,将断点移至用户。断点将在所有Xcode项目中可见。

当你达到断点时,你最终会得到类似的东西......

Breakpoint hit on swift_willThrow

...你必须选择先前的堆栈帧来查看错误被抛出的位置......

Throw stack frame

答案 1 :(得分:6)

刚刚在Xcode 8.3中找到了一个替代方案:有一个&#34; Swift错误断点&#34;菜单中的选项用于添加新的临时断点:

swift error breakpoint

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

custom type