调试堆栈跟踪?

时间:2015-06-09 04:58:08

标签: ios swift

我们从Flurry收到了下面的堆栈跟踪。它是从用户的设备捕获的,我们无法跟踪它。它没有列出我们代码库中的行...我们如何解决堆栈跟踪并隔离问题?

完整堆栈跟踪:

0   libGPUSupportMercury.dylib          0x34d068f6 <redacted> + 9
1   IMGSGX535GLDriver                   0x2f04050f <redacted> + 122
2   GLEngine                            0x32515a01 <redacted> + 172
3   GLEngine                            0x3251590f _gliPresentViewES + 134
4   OpenGLES                            0x325200cd <redacted> + 64
5   SpriteKit                           0x32990191 -[SKView _renderContent] + 1216
6   libdispatch.dylib                   0x3af1381f <redacted> + 22
7   libdispatch.dylib                   0x3af25dd7 <redacted> + 26
8   SpriteKit                           0x3298fca3 -[SKView renderContent] + 82
9   SpriteKit                           0x3298d633 <redacted> + 130
10  SpriteKit                           0x329b00eb -[SKDisplayLink _callbackForNextFrame:] + 254
11  QuartzCore                          0x32766df3 <redacted> + 98
12  QuartzCore                          0x32766b9d <redacted> + 344
13  IOMobileFramebuffer                 0x354df75d <redacted> + 104
14  IOKit                               0x30f69451 _IODispatchCalloutFromCFMessage + 248
15  CoreFoundation                      0x3023eef9 <redacted> + 136
16  CoreFoundation                      0x30249ab7 <redacted> + 34
17  CoreFoundation                      0x30249a53 <redacted> + 346
18  CoreFoundation                      0x30248227 <redacted> + 1398
19  CoreFoundation                      0x301b2f4f _CFRunLoopRunSpecific + 522
20  CoreFoundation                      0x301b2d33 _CFRunLoopRunInMode + 106
21  GraphicsServices                    0x350b7663 _GSEventRunModal + 138
22  UIKit                               0x32afe16d _UIApplicationMain + 1136
23  <OurClassName>                             0x000af494 __mh_execute_header + 345236
24  libdyld.dylib                       0x3af38ab7 <redacted> + 2

1 个答案:

答案 0 :(得分:0)

首先,由于地址空间布局随机化(ASLR),您需要获取左侧(您的应用程序以及每个系统库)中列出的每个模块的基址。许多应用程序堆栈跟踪报告工具(如PLCrashReporter)可以将此信息存储在其报告中。

接下来,您需要获取每个模块的调试符号。对于您的应用程序,在构建时,它应生成.dSym文件,其中包含允许您从地址获取方法和行号的信息。您需要确保获得与产生崩溃的构建相对应的确切.dSym,因为每个构建都不同。

对于系统库,首次使用特定版本的OS将设备连接到Xcode时,Xcode会下载调试符号。它们存储在/Users/<yourusername>/Library/Developer/Xcode/iOS DeviceSupport/中。请注意,有时OS的版本将具有多个版本(beta版或不同版本的不同版本);您需要获得发生崩溃的操作系统构建,这意味着您的堆栈跟踪也需要存储该信息。它还需要是您的Xcode已经看到的操作系统构建,否则它将不会下载信息。对于系统模块,您只能获取函数名称而不是行号(由于它们不是开源的,因此无论如何都不会有用。)

然后,您可以使用工具atos,为其提供地址,加载地址(有争议的模块的基地址),体系结构(对于包含多个体系结构的代码的应用程序),以及它将输出该地址的符号信息。