63

概括

当我设置异常断点时,我没有收到异常消息。如何获取异常消息?我已经知道如何获取堆栈跟踪,但这不包括异常消息。

细节

过去我使用 Xcode 开发 iOS 应用程序,当出现问题时,我会收到错误/异常。异常通常会显示“无法取消引用 null”之类的消息。

现在,在过去几周使用 Xcode 4.6.x 时,我从未收到异常消息。我经常会得到一个 SIGABRT。我在异常断点处设置了中断,它会在那里中断,但它在 iOS SDK 的某些程序集中已关闭,我从未收到消息。

事实上,我不记得上次在调试器控制台中看到任何内容是什么时候了。

迁移到 LLVM 时异常信息是否消失了?

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

是否可能是过去保留的构建设置以某种方式关闭了异常消息?

请重新提出问题。现在有了答案!

在评论中给出了一个很好的答案。这应该提升为完整答案,因此我可以标记已回答的问题,其他有此常见问题的人可以找到它。为了实现这一点,需要重新提出问题!(在那之后我会删除这个请求。)

4

6 回答 6

66

我将在这里更新杰夫的答案:

突出显示导致异常的行(而不是 main.m 中的 UIApplicationMain())并查看异常的原因(例如,“错误:获取请求必须具有实体。”),请执行以下操作:

  • 在断点导航器中:
    1. 添加(+),添加异常断点
    2. 选择新断点,Control-Click,编辑断点
    3. 添加操作
    4. 输入:po $arg1

堆栈跟踪的相关部分将位于导航器区域。

这似乎仍然适用于 Xcode 9

这是我在 Xcode 6 及以下版本中使用的补充。

  1. 输入:po (NSException*) $eax

在 Xcode 6 中,您必须显式提供对象类型,因为它不再被推断。

于 2014-12-08T10:34:25.697 回答
51

对于 Xcode 7-9(基于 Jeff 的回答):

在断点导航器中:

  1. 添加(+),添加异常断点
  2. 选择新断点,Control-Click,编辑断点
  3. 添加操作
  4. 进入:po $arg1
于 2015-12-09T19:28:45.693 回答
12

突出显示导致异常的行(而不是 main.m 中的 UIApplicationMain())并查看异常的原因(例如,“错误:获取请求必须具有实体。”),请执行以下操作:

  • 在断点导航器中:
    1. 添加(+),添加异常断点
    2. 选择新断点,控制点击,编辑断点
    3. 添加操作
    4. 输入:po $eax

堆栈跟踪的相关部分将位于导航器区域。

于 2014-04-08T03:40:36.330 回答
6

是的,xcode 对调试不太友好。我喜欢这篇文章,它可以帮助我更清楚地理解崩溃日志)) 揭秘 iOS 应用程序崩溃日志

如果您看到错误“发送到已释放实例的消息”,也请执行此操作

'产品 -> 编辑方案 -> 启用僵尸对象'

这将启用僵尸对象,当您对项目进行配置时选择“僵尸”,导致错误,您将能够看到哪些对象被释放,例如 NSArray *myArray

于 2013-06-21T15:35:44.957 回答
5

如果没有设置异常断点,我从中获得的信息po $eaxpo (NSException *)$eax似乎与 Xcode 将打印的信息不同。所以我做了以下,

  1. 添加异常断点
  2. 发生异常,断点被命中 ->我知道位置
  3. 暂时禁用断点(调试区域左侧的第二个按钮)
  4. 继续执行程序(Debug 区域左侧第三个按钮)
  5. 打印详细信息 ->我知道原因

显然不是很优雅和灵活,但至少我回答了两个大问题(在哪里和为什么)。

于 2015-09-09T09:18:33.520 回答
4

您可以使用btorthread backtrace命令打印错误跟踪

显示当前线程的堆栈回溯。

您可以在崩溃报告中找到相同的堆栈跟踪

在此处输入图像描述

有关当前线程使用的信息currentThread

//Objective-C
po [NSThread currentThread]

//Swift
po Thread.currentThread

*有时您可以在不工作时使用fr v(或仅从vXCode 10.2 开始)po

于 2019-10-31T11:06:56.217 回答