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

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

 "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

但我的应用程序中有数十个数组,所以我需要帮助来查找抛出exception的特定行,使用从堆栈跟踪中获得的数据。

有没有人知道从苹果或其他的一个很好的文章/教程,在那里我可以学习解码堆栈跟踪中的数字,以find源代码中有问题的行。 提前致谢!

我强烈build议在Xcode中启用exception断点。 它会停止执行你的代码的确切的线路崩溃你的应用程序。 所以你不需要担心崩溃的数组原因。 *** – [__ NSArrayI objectAtIndex:]:索引0超出空数组的边界

添加exception断点

  1. 转到Xcode的断点部分
  2. 点击部分底部的加号
  3. select添加exception断点

异常BreakPoint

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

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

这将提供以下输出:

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

如果你熟悉Log4J框架,我build议看看伐木工人框架,这对我在各种项目中非常有帮助。

 https://github.com/robbiehanson/CocoaLumberjack 

虽然这可能不会直接回答你的问题,但它只是提醒。

在catch块中设置一个断点,一旦代码stream停止,你可以使用gdb命令(如“bt”)。

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

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