2

在删除了调试信息的生产应用程序中,如何转换以下输出:

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

最后一行是面包和黄油行,但是当我使用 dwarf 查找地址时,什么都不存在。

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

我在这里读到,您需要将堆栈地址转换为 dwarf 或 atos 的其他地址:

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

我如何找到加载地址或幻灯片地址来执行计算?在将堆栈跟踪从应用程序内发送到日志之前,是否没有办法计算所有这些?如果不是,我将如何在收到堆栈跟踪后确定和计算这些值?更好的是,我是否缺少更简单的解决方案?

请注意,我不能只等待崩溃报告,因为该应用程序很小而且它们永远不会出现。我计划将堆栈跟踪发送到我们的服务器,以便在它们出现时立即修复。

社论

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

谢谢你的帮助!

4

1 回答 1

0

一个建议,您可以使用以下方法轻松获取方法名称、异常原因和行号:

NSLog(@"%@ Exception in %s on %d due to %@",[exception name],__PRETTY_FUNCTION__,__LINE__,[exception reason]);
于 2014-06-25T14:11:33.010 回答