使用Flurry Crash Analytics对iOS 7崩溃报告进行符号化

我最近为我的应用程序推送了iOS 7更新,并实施了Flurry Analytics,并启用了崩溃报告function。 我最近注意到一些用户遇到崩溃。 使用乱舞我可以检索堆栈跟踪在我的应用程序崩溃的时刻追查问题。
那么,我非常熟悉崩溃报告,并且已经通过从iTunes Connect或邮件中获取错误并使用它们修复了这些错误,并在Xcode中对它们进行了简单的符号化。 然而,我没有使用Flurry做到这一点。

我试过的:
在查看Flurry本身的堆栈跟踪时,这是我得到的: 乱舞堆栈跟踪 正如你所看到的,很多行都是完全符号化的,而其他的则被象征<redacted> 。 一些研究告诉我,苹果在iOS 6和7中剥离了很多debugging符号。
我尝试的第一件事是上传我自己的dSYM文件。 Flurry报告dSYM文件已保存,崩溃报告使用dSYM文件再次被符号化。 但是,堆栈跟踪仍然完全相同,没有dSYM。
没问题,我想,我可以试着下载崩溃报告,并使用Xcode来表示它。 点击下载给我一个文件(没有扩展名,所以我改名为.crash )与这个内容:

 Hardware Model: iPhone3,1 Process: RadioPlayer [2965] Path: /var/mobile/Applications/E4DD7DA6-4450-4538-A1E2-AE23139FAC10/RadioPlayer.app/RadioPlayer Identifier: ******* Version: 1.2.0 Code Type: ARM Parent Process: launchd [1] Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x548a000 Crashed Thread: 2 Thread 0: 0 libsystem_kernel.dylib 0x3aa67a8c _mach_msg_trap + 20 1 CoreFoundation 0x3015e7cb <redacted> + 154 2 CoreFoundation 0x3015cf37 <redacted> + 854 3 CoreFoundation 0x300c7ce7 _CFRunLoopRunSpecific + 522 4 CoreFoundation 0x300c7acb _CFRunLoopRunInMode + 106 5 GraphicsServices 0x34da0283 _GSEventRunModal + 138 6 UIKit 0x32969a41 _UIApplicationMain + 1136 7 RadioPlayer 0x000dfb9b __mh_execute_header + 23451 8 libdyld.dylib 0x3a9c3ab7 <redacted> + 2 Thread 1: 0 libsystem_kernel.dylib 0x3aa6783c _kevent64 + 24 1 libdispatch.dylib 0x3a9a23f3 <redacted> + 38 Thread 2 Crashed: 0 vImage 0x2f19d7dc <redacted> + 139 1 vImage 0x2f1874ff _vImageFlatten_RGBA8888 + 378 2 vImage 0x2f26e799 <redacted> + 40 3 vImage 0x2f27d7c3 <redacted> + 674 4 vImage 0x2f27d365 _vImageConvert_AnyToAny + 1300 5 ImageIO 0x30efd9e7 <redacted> + 858 6 ImageIO 0x30ef8c3b <redacted> + 2754 7 ImageIO 0x30ef8173 <redacted> + 102 8 ImageIO 0x30ef8057 _CGImageDestinationFinalize + 66 9 UIKit 0x32a8a611 _UIImageJPEGRepresentation + 520 10 MediaPlayer 0x31435319 -[MPMediaItemArtwork imageDataWithSize:atPlaybackTime:] + 36 11 MediaPlayer 0x31435387 -[MPMediaItemArtwork albumImageDataWithSize:] + 42 12 MediaPlayer 0x31494f0d -[MPNowPlayingInfoCenter _pushNowPlayingInfoAndRetry:] + 824 13 libdispatch.dylib 0x3a99ed7b <redacted> + 10 14 libdispatch.dylib 0x3a99f2f3 <redacted> + 378 15 libdispatch.dylib 0x3a99f75b <redacted> + 38 16 libdispatch.dylib 0x3a9b18f9 <redacted> + 76 17 libdispatch.dylib 0x3a9b1b79 <redacted> + 56 18 libsystem_pthread.dylib 0x3aae0dbf __pthread_wqthread + 298 19 libsystem_pthread.dylib 0x3aae0c84 _start_wqthread + 8 // The file continues like this listing the other threads and overview of binary images. // I however didn't paste that part here since I don't think it's useful. 

我现在试着简单地将这个文件拖到Xcode组织者和导入设备日志。 两者都没有做什么。 没有在列表中出现任何新的设备日志。
下一步:尝试使用atos手动符号化崩溃日志。 我将dSYM的内容复制到工作目录等,然后尝试这个命令

 xcrun atos -arch armv7 -o RadioPlayer 0x31435387` 

这返回0x31435387 。 我尝试了一些其他的内存地址,输出每次只是内存地址本身。

有谁能帮我解决这个问题吗? 我真的很想象征这些<redacted>符号,因为它肯定会帮助我修复导致这些崩溃的错误。 谢谢!

我注意到,为了能够将Flurry崩溃报告拖到XCode Organizer,您需要:

  1. 将文件重命名为.crash
  2. 在报告顶部添加一个事件标识符行。 这看起来像一个GUID,所以你可以把任何独特的或生成一个在线 ,例如

    事件标识符:D1D6CA1F-EC87-4677-9366-401BE050B2C8

  3. 添加iOS和崩溃报告版本行(就在例外types之上),例如

    操作系统版本:iOS 7.1.1(11D201)

    报告版本:104

  1. <redacted>是仅针对系统符号的iOS优化。
  2. 上传你的应用程序dSYM不会改变一件事情,因为它只包含应用程序符号,而不是所需CPU架构的iOS系统符号。
  3. 为了在本地象征这些符号,您需要具有确切的系统符号或创build崩溃的iOS版本和体系结构。
  4. 使用atos来表示系统符号与您的应用程序二进制/ dSYM不起作用(如上所述)
  5. 通过只传入堆栈帧中的地址来获取符号,从不工作,还需要传递相应二进制的加载地址(可以在二进制图像部分find,二进制行的第一个地址)
  6. 在你的atos例子中,你正在尝试一个已经在栈跟踪中显示正确符号的地址。
  7. 将崩溃报告拖放到Xcode组织者应该已经符号化报告,如果您有符号可用,您将不必执行手动步骤。
  8. 看起来Flurry在服务器上没有iOS符号来自行parsing这些符号。

所以libdispatch.dylib库的0x3a99ed7b的一个例子是:

 xcrun atos -arch armv7 -o PathToLibrary -l LoadAddressOfLibrary 0x3a99ed7b 

Mac上iOS符号的根path是:〜/ Library / Developer / Xcode / iOS DeviceSupport /`,每个iOS版本都有一个子目录。

因此,简单的解决scheme:将崩溃报告拖放到Xcode组织者的Device Logs条目中,并希望您拥有所需的一切。 如果这样做不会删除至less一些<redacted>string,那么您将缺lessiOS符号,手动步骤也不起作用。