Xcodeexception断点不打印抛出exception的细节

概要

当我设置一个exception断点时,我没有得到exception消息。 我如何得到exception消息? 我已经知道如何获取堆栈跟踪,但不包括exception消息。

细节

在过去,我使用Xcode开发iOS应用程序,当出现问题时,我会得到一个错误/exception。 例外通常会有一个消息,如“无法解除引用null”或其他。

现在,使用Xcode 4.6.x在过去几个星期,我从来没有得到一个exception消息。 我经常会得到一个SIGABRT。 我把exception断点打破,它会在那里打破,但它在iOS SDK中的一些程序集closures,我从来没有得到一个消息。

实际上,我不记得上次看到在debugging器控制台中显示的任何内容。

迁移到LLVM时exception信息消失了吗?

让我的应用程序在SDK中崩溃而不知道原因是非常令人沮丧的。 我检查了最后一个函数,以确保事物设置正确(分配对象等),这就意味着我没有线索。

是否有可能从过去持续的构build设置是以某种方式closuresexception消息?

请重新打开问题。 现在有一个答案!

在评论中给出了一个很好的答案。 这应该被提升为完整的答案,所以我可以标记回答的问题,其他有这个共同问题的人可以find它。 为了实现这个目标,这个问题需要重新开放! (我会在发生这种情况后删除这个请求。)

我会在这里更新Jeff的回答:

为了同时在main.m中突出显示引发exception (而不是UIApplicationMain()),并查看exception原因 (例如,“错误:获取请求必须具有实体”),请执行以下操作:

  • 在Breakpoint导航器中:
    1. 添加(+),添加exception断点
    2. select新的断点,控制点击,编辑断点
    3. 添加动作
    4. input: po $ eax

堆栈跟踪的相关部分将位于nagivator区域。

这是我用于Xcode 6的补充。

  1. input: po(NSException *)$ eax

在Xcode 6中,您必须明确提供对象types,因为它不再被推断。

使用po $ arg1似乎现在在Xcode 7及更高版本中效果更好,因为它不依赖于架构。

对于Xcode 7&8(基于Jeff的回答):

在Breakpoint导航器中:

  1. 添加(+),添加exception断点
  2. select新的断点,按住Control键,编辑断点
  3. 添加动作
  4. input: po $arg1

为了同时在main.m中突出显示引发exception (而不是UIApplicationMain()),并查看exception原因 (例如,“错误:获取请求必须具有实体”),请执行以下操作:

  • 在Breakpoint导航器中:
    1. 添加(+),添加exception断点
    2. select新的断点,控制点击,编辑断点
    3. 添加动作
    4. input: po $ eax

堆栈跟踪的相关部分将位于nagivator区域。

是的,xcode对于debugging不太友好。 我喜欢这篇文章,这有助于我明白崩溃日志)) 揭秘iOS应用程序崩溃日志

如果你看到错误“发送到释放实例的消息”

'产品 – >编辑计划 – >启用僵尸对象'

这将使僵尸对象,当你做你的项目configuration文件select“僵尸”,导致错误,你将能够看到哪些对象被释放,例如NSArray * myArray

我从po $eaxpo (NSException *)$eax得到的信息似乎不同于Xcode在没有设置exception断点的情况下打印的信息。 所以我做了以下,

  1. 添加一个exception断点
  2. 发生exception,断点被击中 – > 我知道位置
  3. 暂时禁用断点(debugging区域左侧的第二个button)
  4. 继续执行程序(debugging区域左侧的第三个button)
  5. 细节打印 – > 我知道原因

显然不是很优雅和灵活,但至less我回答了两个大问题(地点和原因)。