Swift调试:app在断点处停止并且不会崩溃

时间:2014-10-28 18:50:06

标签: ios xcode debugging swift breakpoints

在目标C的时代,当我的代码出错并运行它时,我收到了绿色线程断点,但如果我在调试区域中按下“继续执行程序”按钮,我的应用程序崩溃并向我显示确切的错误说明

enter image description here

现在我受到“断点循环”的困扰,如果我按下继续按钮它会停在同一个地方并且永远不会崩溃。应用程序根本没有崩溃,我没有任何应用程序错误说明。这真让我烦恼,Thread 1: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)从良好的旧致命错误描述等角度来看并不是非常有用的信息。

有没有办法打破这个“断点循环”并让应用程序崩溃以查看错误描述?

编辑:

注意:这里我使用了单词断点,我不是指我自己设置的断点,我的意思是默认的运行时崩溃断点。这是它的形象(如果我把它命名为错误,请更正我): enter image description here

我的断点导航器:

enter image description here

1 个答案:

答案 0 :(得分:5)

EXC_BREAKPOINT异常只是意味着程序试图执行某些特定的"陷阱"指令。这恰好是调试器用来设置断点的指令。但是,当程序遇到某种异常情况时,有许多系统组件也使用trap指令来暂停执行。我的想法是,如果您在调试器中,您的应用程序将停止并且您可以分析问题,但如果不是,那么应用程序将在此时死亡。

你可以判断调试器是否对陷阱负责,因为如果lldb将EXC_BREAKPOINT识别为来自它插入的陷阱,那么它会告诉你停止原因是"断点1.1"或者其他 - 它不会显示原始的EXC_BREAKPOINT作为停止原因。因此,如果您看到EXC_BREAKPOINT,则表示您遇到了某种内部断言失败。

通常你可以通过转到堆栈中最底部的框架并查看插入了陷阱的代码来判断发生了什么。有时这在Xcode中并不明显,因为如果在堆栈中出于某种特殊原因而停止,其中最底部的帧是汇编代码,Xcode将选择堆栈中具有调试信息的最低帧。但是如果你看一下堆栈,你可能会在堆栈下方看到更多帧。

您有时也会看到属于您的函数的一小部分代码,但是在您执行正常的返回指令之后。例如,堆栈保护机制会在一些函数之后写一个小错误处理部分,然后跳转然后陷阱,如果它注意到堆栈溢出。