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

时间:2013-06-21 15:12:12

标签: ios objective-c xcode

概要

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

详情

过去我使用Xcode开发了iOS应用程序,当出现问题时,我会收到错误/异常。例外通常会有一条消息,例如“无法取消引用null”等等。

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

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

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

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

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

请重新打开问题。它现在有了答案!

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

6 个答案:

答案 0 :(得分:59)

我将在此更新杰夫的答案:

  

同时使行突出显示异常(而不是main.m中的UIApplicationMain())并查看原因(例如,&# 34;错误:获取请求必须有一个实体。"),执行此操作:

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

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

这似乎仍适用于Xcode 9

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

  1. 输入: po(NSException *)$ eax
  2. 在Xcode 6中,您必须显式提供对象类型,因为不再推断它。

答案 1 :(得分:50)

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

在Breakpoint导航器中:

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

答案 2 :(得分:11)

同时使行突出显示异常(而不是main.m中的UIApplicationMain())并查看原因(例如,&# 34;错误:获取请求必须有一个实体。"),执行此操作:

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

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

答案 3 :(得分:4)

是的,xcode对调试不太友好。我喜欢这篇文章,这有助于我清楚地了解崩溃日志)) Demystifying iOS Application Crash Logs

如果您看到错误“消息已发送到已解除分配的实例”

,也可执行此操作

'产品 - >编辑方案 - >启用Zombie Objects的

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:2)

您可以使用btthread backtrace命令

  

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

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

enter image description here