如何从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断点
- 转到Xcode的断点部分
- 点击部分底部的加号
- select添加exception断点
我不知道如何从堆栈跟踪(还)获取行号,但在我的代码中的某些地方,我想要获得行号打印我用了以下代码片段:
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安全?),但是你去了。