在剥离了调试信息的生产应用中,如何转换输出:
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中,有缺陷的线被发送到谷歌分析,你使用地图来调试线 - 简单(相对)。对于iOS,您将面临:a)等待用户错误报告(对于小型应用程序而言不合理),b)将堆栈跟踪发送到服务器,其中存在关于如何符号化堆栈跟踪的缺乏工具或信息,c)依赖在大型准商业第三方图书馆。这无疑使得构建和扩展变得更加困难 - 希望Apple最终能够注意到这一点。更有希望的是有人发现了一个我可能错过的更简单的解决方案;)
感谢您的帮助!
答案 0 :(得分:0)
建议,您可以使用以下方法轻松获取方法名称,例外原因和行号
NSLog(@"%@ Exception in %s on %d due to %@",[exception name],__PRETTY_FUNCTION__,__LINE__,[exception reason]);