发布ipa:如何在堆栈跟踪中象征我的类调用?显示了框架调用

时间:2012-09-26 21:55:38

标签: objective-c ios stack-trace xcode4.5 symbolicate

我的应用程序是用Objective c和c ++编写的。我正在使用xcode 4.5,当然我有开发者帐户,我的设备没有越狱,我已经在我的开发者帐户中设置了所有内容。 我不使用xcode中的“设备日志”,而是实现了信号/异常处理程序,将堆栈跟踪写入文件,并在下次启动应用程序时将其发送到我的网络服务器。

要在崩溃时获得堆栈跟踪,我使用[NSException callStackSymbols]。有用。所以,当我做样品崩溃时:

NSArray *arr=[NSArray array];
[arr objectAtIndex:100];

在xcode中调试并从设备上的xcode app安装启动时我得到:

0 CoreFoundation 0x36c738a7 __exceptionPreprocess + 186
  1 libobjc.A.dylib 0x3308a259 objc_exception_throw + 32
  2 CoreFoundation 0x36bcb23d -[__NSArrayI objectAtIndex:] + 164
  3 MyApp 0x001be505 _ZN8Menu6handleEN12GestureE + 912
  4 MyApp 0x000e6ce1 _ZN13BaseLevel10handleBaseEN12GestureE + 440
  5 MyApp 0x0011b747 _ZN12Manager6handleEN12GestureE + 742
  6 MyApp 0x00102731 _ZN13Processor9doProcessEd + 552
  7 GLKit 0x3723a0c5 -[GLKViewController _updateAndDraw] + 272
  8 CoreFoundation 0x36bd27d3 -[NSObject performSelector:] + 38
  9 QuartzCore 0x3233486f _ZN2CA7Display11DisplayLink8dispatchEyy + 166
  10 QuartzCore 0x323347c5 _ZN2CA7Display16IOMFBDisplayLink8callbackEP21__IOMobileFramebufferyyyPv + 60

MyApp c ++和objc类和方法符号确定。

但是,当我制作AdHoc ipa,并在其中做同样的工作时,我得到:

0 CoreFoundation 0x36c738a7 __exceptionPreprocess + 186
  1 libobjc.A.dylib 0x3308a259 objc_exception_throw + 32
  2 CoreFoundation 0x36bcb23d -[__NSArrayI objectAtIndex:] + 164
  3 MyApp 0x001be505 _mh_execute_header + 894213
  4 MyApp 0x000e6ce1 _mh_execute_header + 11489
  5 MyApp 0x0011b747 _mh_execute_header + 227143
  6 MyApp 0x00102731 _mh_execute_header + 124721
  7 GLKit 0x3723a0c5 -[GLKViewController _updateAndDraw] + 272
  8 CoreFoundation 0x36bd27d3 -[NSObject performSelector:] + 38
  9 QuartzCore 0x3233486f _ZN2CA7Display11DisplayLink8dispatchEyy + 166
  10 QuartzCore 0x323347c5 _ZN2CA7Display16IOMFBDisplayLink8callbackEP21__IOMobileFramebufferyyyPv + 60]

即。我的类和方法的名称都消失了,取而代之的是符号_mh_execute_header +< offset>。

我以为我错过了dSYM设置,但是对于发布和调试都是开启的,“条带调试符号”也是关闭的。

搜索了SO,但没有运气。请告诉我有什么问题?

2 个答案:

答案 0 :(得分:1)

我的坏,我不熟悉象征性技术。 简而言之 - 为了象征堆栈跟踪,你需要dSYM包和xcode来用它的私有api来表示崩溃日志。也许下次我会写更多:仍然学习如何以最方便(对我来说)的方式来做。

编辑:一周过去了,我已经开发了一个解决方案。它是我的多平台生态系统特有的,但在这里它是如何工作的。应用程序崩溃并将包含所有所需数据的崩溃日志发送到我的服务器。当我想查看崩溃日志时,我在我的桌面上启动实用程序,从服务器下载所有堆栈(来自发布/ arm二进制文件),这些堆栈尚未被执行。接下来,它在Xcode Archives文件夹中找到相应的包(获取需要的uuids / vmaddr),然后计算堆栈行的实际地址(使用接收日志中的二进制vmaddr和_mh_execute_header地址)并为每个地址调用atos。然后它解析atos的输出,生成diff并将其发送回服务器。这样我就可以在基于php的bugtracker中看到符号化的堆栈。 这不是那么容易,就像在java中使用反混淆堆栈一样,但它仍然是可能的。

答案 1 :(得分:0)

您可以使用我编写的符号化工具快速对应用程序的地址进行符号化。

symbolication your.app.dSYM your.app.trace

符号化版本将打印到STDOUT。为获得最佳效果,请将.app保存在与.dSYM相同的文件夹中。

https://github.com/Imperiopolis/Symbolication