iOS:使用行号将stacktrace条目转换为方法名称

时间:2014-06-25 14:08:48

标签: ios debugging stack-trace dwarf

在剥离了调试信息的生产应用中,如何转换输出:

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最终能够注意到这一点。更有希望的是有人发现了一个我可能错过的更简单的解决方案;)

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

建议,您可以使用以下方法轻松获取方法名称,例外原因和行号

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