22

我使用NSSetUncaughtExceptionHandler将堆栈跟踪打印到 iPhone 中的本地文件,该文件将在下次启动应用程序时发送到我们的服务器。然后我可以检查异常数据并修复错误。在某些崩溃中,我有模块名称和引发异常的函数,这些都很容易。但大多数情况下我有这样的事情:

"4   libc++abi.dylib 0x35bba3c5 _ZL19safe_handler_callerPFvvE + 76",
"5   libc++abi.dylib 0x35bba451 _ZdlPv + 0",
"6   libc++abi.dylib 0x35bbb825 __cxa_current_exception_type + 0",
"7   libobjc.A.dylib 0x37bab2a9 objc_exception_rethrow + 12",
"8   CoreFoundation  0x3575a50d CFRunLoopRunSpecific + 404"

例如原因:

*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array

但是我的应用程序中有几十个数组,所以我需要帮助来找到引发异常的特定行,使用从堆栈跟踪中获得的数据。

有谁知道 Apple 或其他公司的一篇好文章/教程,我可以在其中学习解码堆栈跟踪中的数字以在源代码中找到有问题的行。提前致谢!

4

4 回答 4

23

我强烈建议在 Xcode 中启用异常断点。它将在使您的应用程序崩溃的确切行上停止执行您的代码。所以你不必担心是哪个数组导致崩溃。*** -[__NSArrayI objectAtIndex:]:空数组的索引 0 超出范围

添加异常断点

  1. 转到 Xcode 上的断点部分
  2. 单击该部分底部的加号
  3. 选择添加异常断点

异常断点

于 2013-05-06T06:43:07.670 回答
2

我不知道如何从堆栈跟踪中获取行号(还),但是在我想要打印行号的代码中的某些点上,我使用了以下代码片段:

NSLog(@"%s line=%d", __func__, __LINE__);

这将给出以下输出:

2013-04-01 00:16:46.393 MyApp[847:c07] -[AppDelegate application:didFinishLaunchingWithOptions:] line=29

如果您熟悉 Log4J 框架,我建议您查看 Lumberjack 框架,该框架在各种项目中对我很有帮助。

https://github.com/robbiehanson/CocoaLumberjack

虽然这可能不能直接回答您的问题,但它只是作为一个提醒。

于 2013-03-31T22:21:46.513 回答
-1

在 catch 块中设置断点,一旦代码流停止,您可以使用 gdb 命令,如“bt”。

于 2012-09-23T01:27:05.843 回答
-1

打印存储在异常中的堆栈跟踪,即[exception callStackSymbols][exception callStackReturnAddresses]。在 Apple 自 iOS 5 以来的崩溃日志中,这在顶部显示为“Last Exception Backtrace”。

您看到的是重新抛出异常时的调用堆栈,这将发生在简单的try...finally. 我不确定 Apple 做出此更改的确切原因(可能是为了使运行循环异常安全?),但你去吧。

于 2012-09-23T02:20:53.437 回答