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

dgiusagp  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(173)

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

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

siotufzp1#

首先要记住的是,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。可能主要原因是抛出的错误不是异常,他们还没有弄清楚把它放在哪里(谁知道呢)。

手动添加

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

自动添加

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

...当您确实想在throw上停止时,可以切换它(开/关)。

符号断点

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

......我暂时不推荐这种方式,因为以后可以改变,但如果现在就足够了,为什么不呢?
您可以像这样在Xcode项目之间共享断点...

...辅助点按,* 将断点移到 用户 *。断点将在所有Xcode项目中可见。
当你遇到断点时,你会得到这样的结果...
x1c4d 1x指令集
...并且您必须选择上一个堆栈帧以查看引发错误的位置...

ne5o7dgx

ne5o7dgx2#

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

如果右键单击新创建的断点,甚至可以指定一个特定的符合Error的类型来中断。

相关问题