2014-06-25 108 views
1

转换为方法名称在生产应用与剥离出去的调试信息,你怎么的输出转换:的iOS:堆栈跟踪进入行号

NSLog(@"Stack Trace: %@", [exception callStackSymbols]); 

要一个清晰的类和方法的名字吗?行号将是一个祝福。

这里是我得到的输出:

0 CoreFoundation      0x23d82f23 <redacted> + 154 
1 libobjc.A.dylib      0x23519ce7 objc_exception_throw + 38 
2 CoreFoundation      0x23cb92f1 <redacted> + 176 
3 MyApp        0x23234815 MyApp + 440341 

的最后一行是面包,黄油线,但是当我使用矮人找到地址,什么都不存在。

dwarfdump --arch armv7 MyApp.dSYM --lookup 0x00234815 | grep 'Line table' 

我在这里读了你需要的堆栈地址转换为矮化或ATOS别的东西:

https://stackoverflow.com/a/12464678/2317728

我怎么会找到加载地址或幻灯片地址进行如何计算?在将堆栈跟踪从应用程序发送到日志之前,没有办法计算所有这些吗?如果不是,我将如何在收到堆栈跟踪后确定并计算这些值?更好的是,我错过了一个更简单的解决方案吗?

注意我不能等待崩溃报告,因为该应用程序很小,他们永远不会来。我计划将堆栈跟踪发送到我们的服务器,一旦出现就立即修复。

社论的iOS

的崩溃报告工具是非常粗糙的,尤其是当相比于Android系统。在android中,bug行被发送到谷歌分析,您使用地图来调试线 - 简单(比较)。对于iOS,您面临以下问题:a)等待用户错误报告(对于小应用程序不合理); b)将堆栈跟踪发送到服务器,但没有足够的工具或有关如何符号化堆栈跟踪的信息; c)依赖在大型准商业第三方图书馆。这肯定会让它难以建立和扩大规模 - 希望苹果最终会注意到这一点。更有希望的人发现了我可能错过的更简单的解决方案;)

感谢您的帮助!

+2

有你看着https://www.plcrashreporter.org/它支持许多这些商业崩溃报告服务?这听起来像你可能会试图重塑大部分的工具。 – Jonah

+0

感谢您的建议 - 它们看起来很不错,但该项目的大小是我应用程序大小的几倍。如果我能弄清楚如何将输出转换为可理解的内容,那么服务器的内容只需要30分钟,而且我可以避免将大型第三方代码库添加到项目中。 –

+1

一些注意事项:1.您只会通过此机制获得带有异常的报告,而不会由信号处理程序引起崩溃。 2.为了表示'callStackSymbols'的数据,你需要编写你自己的解析器和逻辑,并使用带有正确参数的'atos'。 3. PLCrashReporter的大小究竟是什么?代码,静态库二进制文件?除非您链接并检查,否则两者都不会提示您的应用会变得多大。 4.发生异常时发送崩溃报告是一个坏主意。 5.崩溃/异常与您从Android中知道的方式不同。不要使用相同的方法! – Kerni

回答

0

一个建议,你可以用轻松地获得方法名,异常原因和行号:

NSLog(@"%@ Exception in %s on %d due to %@",[exception name],__PRETTY_FUNCTION__,__LINE__,[exception reason]); 
+0

谢谢我添加了.name和.reason。其余的不幸指向我的异常处理程序中的行。我也不认为它可以用于生产应用程序中的符号。 –