Ios Xcode异常断点不存在';t打印正在引发的异常的详细信息 总结

Ios Xcode异常断点不存在';t打印正在引发的异常的详细信息 总结,ios,objective-c,xcode,Ios,Objective C,Xcode,设置异常断点时,不会收到异常消息。如何获取异常消息?我已经知道如何获取堆栈跟踪,但其中不包括异常消息 细节 在过去,我用Xcode开发iOS应用程序,当出现问题时,我会得到一个错误/异常。异常通常会有一条消息,如“can not dereference null”或其他什么 现在,在过去的几周里,我一直使用Xcode 4.6.x,从未收到过异常消息。我经常会得到一个小布条。我输入了break-on-exception断点,它将在那里中断,但它在iOS SDK的某些程序集中关闭,我从未收到消息 事

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

细节 在过去,我用Xcode开发iOS应用程序,当出现问题时,我会得到一个错误/异常。异常通常会有一条消息,如“can not dereference null”或其他什么

现在,在过去的几周里,我一直使用Xcode 4.6.x,从未收到过异常消息。我经常会得到一个小布条。我输入了break-on-exception断点,它将在那里中断,但它在iOS SDK的某些程序集中关闭,我从未收到消息

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

迁移到LLVM时是否显示异常信息

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

是否可能是因为以前的构建设置以某种方式关闭了异常消息

请重新开始提问。它现在有了答案!
评论中给出了一个极好的答案。这应该被提升为完整答案,这样我就可以标记所回答的问题,其他有这个共同问题的人也可以找到它。为了实现这一点,这个问题需要重新讨论!(发生这种情况后,我将删除此请求。)

是的,xcode对于调试来说并不友好。我喜欢这篇文章,它可以帮助我更清楚地理解崩溃日志。)

如果看到错误“消息已发送到解除分配的实例”,也要执行此操作

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

这将启用僵尸对象,并在对项目进行配置时选择
“zombie”,引起错误,您将能够看到释放了哪些对象,例如NSArray*myArray

使引起异常的行高亮显示(而不是main.m中的UIApplicationMain()),并看到异常的原因(例如,“错误:获取请求必须有一个实体”),执行以下操作:

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

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

我将在此处更新Jeff的答案:


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

  • 在断点导航器中:
  • 添加(+),添加异常断点
  • 选择新断点,控制单击,编辑断点
  • 添加操作
  • 输入:po$arg1
堆栈跟踪的相关部分将位于nagivator区域

这似乎在Xcode 9中仍然有效

这是我添加的用于Xcode 6及以下版本的代码

  • 输入:po(NSException*)$eax

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

    我从
    po$eax
    po(NSException*)$eax获得的信息似乎与Xcode在未设置异常断点的情况下打印的信息不同。所以我做了以下几件事

  • 添加异常断点
  • 发生异常,断点被命中->我知道位置
  • 暂时禁用断点(调试区域左侧的第二个按钮)
  • 继续程序执行(调试区域左侧的第三个按钮)
  • 详情已打印->我知道原因
  • 显然不是很优雅和灵活,但至少我回答了两个大问题(在哪里以及为什么)。

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

    在断点导航器中:

  • 添加(+),添加异常断点
  • 选择新断点,控制单击,编辑断点
  • 添加操作
  • 输入:
    po$arg1

  • 您可以使用
    bt
    threadbacktrace
    命令打印错误跟踪

    显示当前线程的堆栈回溯跟踪

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

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

    //Objective-C
    po [NSThread currentThread]
    
    //Swift
    po Thread.currentThread
    

    *有时,当
    po
    不工作时,您可以使用
    fr v
    (或仅使用XCode 10.2中的
    v

    在该断点中是否有
    bt
    作为操作?右键单击->编辑断点->操作->下拉菜单中的“调试器命令”,文本字段中的
    bt
    。这应该在控制台中打印回溯。如果设置了异常断点,则只需创建回溯,然后在将异常打印到控制台之前命中该断点。我解释了如何设置断点来打印异常。你看过吗?因为我一直被同样的问题困扰着,在2013年WWDC上,我请了一些lldb团队成员来帮助我解决这个问题。我在那个链接中解释了如何解决这个问题。如果问题被重新打开,我会的。有趣的是,下面的“启用僵尸对象”选项之一是“日志异常”,这之前没有检查过。我已经检查过了,看看这是否解决了问题。我在不止一个地方看到了这条建议。。。但是它不再在Xcode 6中工作。或者,您也可以转到控制台窗口,在调试控制台中输入po(NSException*)$eax。重要提示:如果您正在创建64位应用程序,则使用$rax代替$eax<代码>采购订单(NSException*)$rax
    在Xcode 6.3中,我得到的结果错误:使用了未声明的标识符“$eax”-相同的f