【问题标题】:Xcode 4 break on exception or assert with good call stack AND printing of the exceptionXcode 4 中断异常或断言具有良好的调用堆栈和异常打印
【发布时间】:2012-09-26 21:46:16
【问题描述】:

使用 Xcode 4.3.2。我查看了许多不同的类似问题,包括这个

no-call-stack-on-exception-in-xcode-4

但无法让调试器(gdb 或 lldb)给我一个很好的堆栈跟踪,显示异常的位置,并且还打印异常是什么

objc_exception_throw 上设置符号异常或“所有异常”异常断点,lldb 不会为我提供良好的堆栈跟踪,但会显示以下内容:

  • 线程#1:tid = 0x1c03, 0x34455238 libobjc.A.dylibobjc_exception_throw, stop reason = breakpoint 1.1 frame #0: 0x34455238 libobjc.A.dylibobjc_exception_throw 第 1 帧:0x323ff788 CoreFoundation`+[NSException raise:format:arguments:] + 100

这就是全部,无论是通过bt 还是在图形断点/调试器视图中完全放大。

如果此时我点击继续几次,它最终会告诉我异常/断言,例如

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“_endUndoGroupRemovingIfEmpty:: NSUndoManager 0x2b7610 处于无效状态,调用 endUndoGrouping 时没有匹配的开始

但我不知道它在哪里。

gdb,使用相同的断点,将停止并告诉我它在哪里,但不打印异常文本。如果我点击 continue 几次它会,但我已经失去了回溯的上下文。

我想知道如何打印异常文本,这样我就知道它为什么停止了,而不必做一些继续并失去我的位置。我也想让它像在 gdb 中那样在异常点停止在 lldb 中。

【问题讨论】:

标签: ios xcode exception gdb lldb


【解决方案1】:

请尝试更新到 Xcode 4.5。您会看到一个 armv7 展开器问题,其中 lldb 不知道如何完全展开您的堆栈。 Objective-C 运行时有一些难以摆脱的功能(手写程序集),但我只是在带有 Xcode 4.5 的 iOS 设备上进行了快速测试,当我让 Xcode 在抛出时设置异常断点时 lldb 行为正确。

【讨论】:

  • 我会试试的。谢谢!我解决了我之前因这个问题而恶化的代码问题,所以我必须设计一些测试用例来看看它是如何工作的。谢谢!
  • 我还没有尝试过 Xcode 4.5,因为我正处于项目的关键点,我不喜欢在这样的关头搞乱我的工具。但我并没有忘记这一点,一旦项目结束,我会重新审视。
猜你喜欢
  • 2012-03-21
  • 2015-05-03
  • 2013-06-18
  • 1970-01-01
  • 2011-10-28
  • 2012-12-25
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多