有一段时间了,我一直遇到一个问题,我会在一些库代码中导致断言失败,而Xcode也不会对我所做的事情进行说明。
通常在发生这种情况时(例如,当您删除tableview行但不从数据源中删除它们时),在日志中会出现如下错误:
*** Assertion failure in -[SomeClass someMethodName:], /Some/Source/Path/File.m:###
*** Terminating app due to uncaught exception 'SomeException', reason: 'A helpfully descriptive reason for the crash'
最近,我一直在第一线,但没有第二线。我很难调整模糊的I-did-something-something-to-SomeClass
。从这一点来说,如果我在调试器中点击“继续”,它只会点击同一行(我们在main.m
中知道的那一行)并将停止原因从SIGABRT
更改为EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, subcode=0x0)
。< / p>
我改变了什么来阻止Xcode的帮助,以及如何重新开启帮助?
更新2014/11/17 :
当我通过将错误的东西放入自动布局可视化格式字符串中来崩溃应用程序时,我根本没有打印输出。它应该说一些关于视图没有被发现字符串的其他错误,但它只是在调试器中暂停与上面相同的行为。我不记得该错误是否在断言之前,但如果是,那么在这种情况下都没有打印。
答案 0 :(得分:0)
Xcode不会生成这些错误消息。第一个是在Foundation方法中引发异常,第二个是由Foundation中未捕获的异常处理程序输出。它们都写入stdout,这就是你在Debugger控制台窗口中看到它们的原因。请注意,当您附加到进程时,您不会在Xcode中看到任何消息 - 然后输出将转到Console.app日志。
我不确定你为什么没有得到第二行,也许有些东西会覆盖默认的未捕获异常处理程序?
无论如何,在抛出异常时弄清楚发生了什么的最简单方法是打开ObjC异常断点。您可以在添加断点弹出窗口中的Xcode中执行此操作,或者使用以下命令在lldb中执行此操作:
(lldb) break set -E objc
然后当你点击这个断点时:
(lldb) po $arg1
第一个参数是抛出的异常对象,po
将打印异常的reason字段。