1

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

为了获得崩溃时的堆栈跟踪,我使用 [NSException callStackSymbols]。有用。因此,当我进行示例崩溃时,例如:

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

在 xcode 中调试并从设备上的 xcode 应用程序安装启动时,我得到:

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,但没有运气。请告诉我怎么了?

4

2 回答 2

1

我的错,我不熟悉象征性技术。简而言之-要符号化堆栈跟踪,您需要包的 dSYM 和 xcode 来使用其私有 api 符号化崩溃日志。也许下次我会写更多:仍在学习如何以最方便(对我而言)的方式来做。

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

于 2012-09-29T01:08:28.440 回答
0

您可以使用我编写的这个符号化工具来快速符号化您的应用程序的地址。

symbolication your.app.dSYM your.app.trace

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

https://github.com/Imperiopolis/Symbolication

于 2012-10-19T12:17:59.653 回答