使用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,您需要:
- 将文件重命名为.crash
-
在报告顶部添加一个事件标识符行。 这看起来像一个GUID,所以你可以把任何独特的或生成一个在线 ,例如
事件标识符:D1D6CA1F-EC87-4677-9366-401BE050B2C8
-
添加iOS和崩溃报告版本行(就在例外types之上),例如
操作系统版本:iOS 7.1.1(11D201)
报告版本:104
-
<redacted>
是仅针对系统符号的iOS优化。 - 上传你的应用程序dSYM不会改变一件事情,因为它只包含应用程序符号,而不是所需CPU架构的iOS系统符号。
- 为了在本地象征这些符号,您需要具有确切的系统符号或创build崩溃的iOS版本和体系结构。
- 使用
atos
来表示系统符号与您的应用程序二进制/ dSYM不起作用(如上所述) - 通过只传入堆栈帧中的地址来获取符号,从不工作,还需要传递相应二进制的加载地址(可以在二进制图像部分find,二进制行的第一个地址)
- 在你的
atos
例子中,你正在尝试一个已经在栈跟踪中显示正确符号的地址。 - 将崩溃报告拖放到Xcode组织者应该已经符号化报告,如果您有符号可用,您将不必执行手动步骤。
- 看起来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符号,手动步骤也不起作用。
这对我的乱七八糟的日志工作http://ipartymobile.com/how-to-find-your-bug-from-ios-crash-logs/不必添加任何东西崩溃报告,只需要内存地址,并插入以这种格式“xcrun atos -arch armv7 -o MyApp 0x0000000”