如何从堆栈跟踪在OBJ-C / IOS源代码行(How to get source code lin

2019-07-31 05:15发布

我用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

但我有几十个在我的应用程序阵列的,所以我需要帮助,找到抛出异常,用我从堆栈跟踪获取数据的具体线路。

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

Answer 1:

我强烈建议启用异常断点在Xcode。 它会阻止你的代码的执行上崩溃您的应用程序中的特定行。 所以你不必担心它崩溃的阵列原因。 *** - [__ NSArrayI objectAtIndex:]:索引0超出界限为空数组

添加异常断点

  1. 转到上的Xcode断点节
  2. 点击加在部分的底部唱
  3. 选择添加例外断点



Answer 2:

我不知道如何从堆栈跟踪行号(还),但在我的代码中的一些点,我想获得行号印我使用的有下面的代码片段:

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

这将给以下的输出:

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

如果你熟悉Log4J的框架I'ld建议看看这个伐木工人框架,证明是我在不同的项目中非常有用。

https://github.com/robbiehanson/CocoaLumberjack

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



Answer 3:

在catch块中设置断点,一旦代码流动停止,你可以像使用“BT” gdb命令。



Answer 4:

打印存储在异常堆栈跟踪,即, [exception callStackSymbols][exception callStackReturnAddresses] 自从iOS 5的苹果公司的崩溃日志,这表明在最顶端的“上次异常回溯”。

你看到的是,当异常被重新抛出调用堆栈,这会发生的事情就这么简单try...finally 。 我不知道到底为什么苹果做出这种变化(可能使运行循环异常安全?),但你去那里。



文章来源: How to get source code line from stack trace in obj-c / ios