如何从obj-c / ios中的堆栈跟踪获取源代码行

时间:2012-08-27 12:14:47

标签: objective-c ios debugging exception-handling stack

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

"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 个答案:

答案 0 :(得分:22)

我强烈建议在Xcode中启用Exception Breakpoint。它将停止在崩溃应用程序的确切行上执行代码。因此,您无需担心崩溃导致的阵列原因。 *** - [__ NSArrayI objectAtIndex:]:索引0超出空数组的边界

添加例外断点

  1. 转到Xcode上的Breakpoints部分
  2. 点击本节底部的加唱歌
  3. 选择添加例外断点
  4. Exception BreakPoint

答案 1 :(得分: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

虽然这可能无法直接回答您的问题,但它只是提醒您。

答案 2 :(得分:-1)

在catch块中设置断点,一旦代码流停止,就可以使用像'bt'这样的gdb命令。

答案 3 :(得分:-1)

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

你所看到的是重新抛出异常时的调用堆栈,这将发生在像try...finally这样简单的事情上。我不确定为什么Apple会做出这样的改变(可能会使运行循环异常安全?),但是你去了。