Xcode异常断点不会打印抛出异常的详细信息

nir*_*ana 59 xcode objective-c ios

摘要

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

细节

在过去,我使用Xcode开发了iOS应用程序,当出现问题时,我会收到错误/异常.该异常通常会有一个消息,如"无法取消引用null"或其他任何内容.

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

事实上,我不记得上次看到调试器控制台中出现的任何内容.

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

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

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

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

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

uca*_*tit 63

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

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

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

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

这似乎仍然适用于Xcode 9

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

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

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

  • 重要说明:如果要创建64位应用程序,请使用$ rax,而不是使用$ eax.`po(NSException*)$ rax` (12认同)
  • 在Xcode 6.3中我得到结果错误:使用未声明的标识符'$ eax' - 对于rax也是如此.难道我做错了什么? (7认同)
  • 在Xcode 8中使用Swift时,`po $ arg1`会打印一个像`106102873062904`这样的大数字.这是什么意思?如何打印尖头弦? (5认同)

jca*_*ady 50

对于Xcode 7-9(根据杰夫的回答):

在Breakpoint导航器中:

  1. 添加(+),添加异常断点
  2. 选择新断点,按住Control键,编辑断点
  3. 添加动作
  4. 输入: po $arg1

  • 这显示了"错误:在XCode 7.3中使用未解析的标识符'$ arg1'" (2认同)
  • 如果在Swift中po $ arg1没有打印出有用的信息,那么将异常部分从All更改为Objective-C. (2认同)

Jef*_*eff 13

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

  • 在Breakpoint导航器中:
    1. 添加(+),添加异常断点
    2. 选择新断点,Contorl-Click,Edit Breakpoint
    3. 添加动作
    4. 输入:po $ eax

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

  • 我在不止一个地方看过这条建议......但它不再适用于Xcode 6. (3认同)

Rom*_*oma 6

是的,xcode不太适合调试。我喜欢这篇文章,可以帮助我更清楚地了解崩溃日志)) 揭开iOS应用崩溃日志的神秘面纱

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

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

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


bca*_*use 5

如果未设置异常断点,则我从Xcode所获得的信息po $eaxpo (NSException *)$eax似乎与Xcode所打印的信息不同。因此,我执行以下操作

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

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


yoA*_*ex5 5

LLDB 线程回溯

[低级虚拟机(LLVM)]

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

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

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

在此输入图像描述

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

//Objective-C
po [NSThread currentThread]

//Swift
po Thread.currentThread
Run Code Online (Sandbox Code Playgroud)

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