首页 文章

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

提问于
浏览
10

我最近为我的应用推出了iOS 7更新,并实现了Flurry Analytics并启用了崩溃报告 . 我最近注意到一些用户遇到了崩溃 . 使用Flurry我可以在应用程序崩溃时检索堆栈跟踪以追踪问题 .
好吧,我使用Flurry成功地做到了这一点 .

What I tried:
在Flurry本身上查看堆栈跟踪时,这就是我得到的:
Flurry stack trace
正如您所看到的,很多行都是完美的符号,其他行符号为 <redacted> . 一些研究告诉我Apple在iOS 6和7中剥离了很多调试符号 .
我尝试的第一件事是上传我自己的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> 符号,因为它肯定会帮助我修复导致这些崩溃的错误 . 谢谢!

3 回答

  • 1

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

    • 将文件重命名为.crash

    • 在报告顶部添加事件标识符行 . 这看起来像一个GUID,因此您可以放置任何唯一的或generate one online,例如

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

    • 添加iOS和崩溃报告版本行(在例外类型上方),例如

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

    报告版本:104

  • 6
    • <redacted> 仅适用于系统符号的iOS优化 .

    • 上传您的应用程序dSYM不会更改任何内容,因为它只包含应用程序符号,而不是所需cpu体系结构的iOS系统符号 .

    • 要在本地表示符号,您需要具有确切的系统符号或创建崩溃的iOS版本和体系结构 .

    • 使用 atos 用您的应用程序二进制文件/ dSYM表示系统符号不起作用(如上所述)

    • 只通过传递堆栈帧中的地址获取符号,从不起作用,还需要传递相应二进制文件的加载地址(可以在二进制图像部分找到,二进制行中的第一个地址) )

    • 在您的 atos 示例中,您正在尝试一个已在堆栈跟踪中显示正确符号的地址 .

    • 如果您有符号可用,则将崩溃报告拖动到Xcode管理器中应该已经对报告进行了符号化,您不必执行手动步骤 .

    • 看起来Flurry的服务器上没有iOS符号来解析这些符号本身 .

    因此, libdispatch.dylib 库的 0x3a99ed7b 示例如下:

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

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

    所以简单的解决方案是:将崩溃报告拖到Xcode组织器的 Device Logs 条目中,并希望您拥有所需的一切 . 如果这不能删除至少一些 <redacted> 字符串,则缺少iOS符号,手动步骤也不起作用 .

  • 10

    这适用于我的flurry日志http://ipartymobile.com/how-to-find-your-bug-from-ios-crash-logs/没有添加任何崩溃报告,只需占用内存地址并插入这种格式“xcrun atos -arch armv7 -o MyApp 0x0000000”

相关问题