在删除了调试信息的生产应用程序中,如何转换以下输出:
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 方库上。这肯定会让构建和扩大规模变得更加困难——希望苹果最终会注意到这一点。更有希望有人发现了一个我可能错过的更简单的解决方案;)
谢谢你的帮助!