4

我的一个应用程序(发行版)没有响应,所以我不得不强制退出它。

OS X 提供了一个挂起报告(无崩溃报告),我将其复制到 *.crash 文件中。

我知道我可以使用诸如 HockeyApp 之类的服务或atos直接符号化崩溃报告,但是如何符号化 OS X 应用程序的挂起报告?

4

1 回答 1

10

一段时间后,我发现了如何处理 Hang 报告,这与正常的崩溃报告略有不同。这是我所做的:

  1. 在 Xcode 中查找在 Organizer 中崩溃的应用程序的相应存档并在 Finder 中显示它(右键单击)。
  2. 右键单击存档并选择Show Package Contents.
  3. 将目录中的*.app源文件Products和相应*.dSYM文件复制dSYMs到一个新文件夹中,例如,在您的桌面上。您将在新文件夹中拥有一个MyApp.app和一个MyApp.app.dSYM 。文件的命名很重要。
  4. ls通过终端进入新文件夹。

现在要使用该atos工具('将数字地址转换为二进制图像或进程的符号'),我们需要首先确定应用程序在运行时的加载地址,以及应用程序挂起时堆栈帧的地址。

  1. 打开挂起报告,找到一条线,该线Binary Images:在该线下方的某处Heaviest stack for ...。在我的情况下,这看起来类似于:

    Binary Images:
         **0x107b0f000** -        0x108b59fff  com.company.MyApp 1.1.0 (2)  <6080DCE1-9086-311C-899F-CC22B32D694D>  /Applications/MyApp.app/Contents/MacOS/MyApp
          0x7fff89c7e000 -     0x7fff89c87fff  libsystem_pthread.dylib (105.10.1)  <3103AA7F-3BAE-3673-9649-47FFD7E15C97>  /usr/lib/system/libsystem_pthread.dylib
          0x7fff8b0bf000 -     0x7fff8bc06fff  com.apple.AppKit 6.9 (1344.36)      <D94A7D32-A789-37EA-A85C-BEFA7DE716E6>  /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
          0x7fff8bd6e000 -     0x7fff8c09cfff  com.apple.Foundation 6.9 (1152.12)  <C0EE9DA6-C111-358A-8874-DA175BB797D6>  /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
    

0x107b0f000** 包围的地址是我们的加载地址,你应该复制它。

  1. 接下来,我们需要找到我们想要为其查找符号信息的地址,即获取实际的方法签名和导致挂起的代码行。因此,请在 Hang 报告开头的“Heaviest stack”下方的堆栈中查找您的应用程序名称:

    Heaviest stack for the main thread of the target process:
      10  start + 1 (libdyld.dylib + 13769) [0x7fff91df35c9]
      10  NSApplicationMain + 1832 (AppKit + 10612) [0x7fff8b0c1974]
      10  -[NSApplication run] + 594 (AppKit + 95459) [0x7fff8b0d64e3]
      10  -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 194 (AppKit + 145072) [0x7fff8b0e26b0]
      10  _DPSNextEvent + 964 (AppKit + 147201) [0x7fff8b0e2f01]
      10  _BlockUntilNextEventMatchingListInModeWithFilter + 71 (HIToolbox + 190347) [0x7fff96ae378b]
      10  ReceiveNextEventCommon + 431 (HIToolbox + 190794) [0x7fff96ae394a]
      10  RunCurrentEventLoopInMode + 235 (HIToolbox + 191439) [0x7fff96ae3bcf]
      10  CFRunLoopRunSpecific + 296 (CoreFoundation + 464984) [0x7fff901f1858]
      10  __CFRunLoopRun + 927 (CoreFoundation + 466495) [0x7fff901f1e3f]
      10  __CFRunLoopDoSources0 + 269 (CoreFoundation + 469005) [0x7fff901f280d]
      10  __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 (CoreFoundation + 525953) [0x7fff90200681]
      10  __NSThreadPerformPerform + 293 (Foundation + 416988) [0x7fff8bdd3cdc]
      10  ??? (MyApp + 62967) [0x108b1e5f7]
      8  ??? (MyApp + 48600) [0x108b1add8]
      8  -[IKImageBrowserView(ImageBrowserLayout) itemFrameAtIndex:] + 63 (ImageKit + 400983) [0x7fff91140e57]
    [...]
    

在此示例堆栈跟踪的末尾,您会发现 MyApp 列出了两次。复制两个地址 , 0x108b1e5f70x108b1add8然后关闭报告。

  1. 现在我们可以使用了atos。在终端中输入以下内容并按回车:

    atos -o MyApp.app/Contents/MacOS/MyApp -arch x86_64 -l 0x107b0f000 0x108b1e5f7  0x108b1add8
    
  2. atos将使用同一目录中的 *.dSYM 文件对地址进行符号化,并希望输出如下内容:

    -[MainWindowController loadDidFinish:] (in MyApp) (MainWindowController.m:127)
    -[MainWindowController view:stringForToolTip:point:userData:] (in MyApp) (MainWindowController.m:231)
    

是的,这看起来很有希望!如果atos输出与您输入的地址相同的地址,而不是代码行,则出现问题。此处错误的主要来源可能是错误的内存地址,因此请确保您选择了正确的地址。

如果您还有其他问题,请告诉我 (@raffael_me)。

于 2014-12-15T11:05:40.030 回答