如何为OS X应用程序表示挂起报告?

Raf*_*ael 4 macos crash-reports hang symbolicatecrash

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

OS X提交了一个Hang报告(没有崩溃报告),我将其复制到*.crash文件中.

我知道我可以使用HockeyApp等服务或atos直接表示崩溃报告,但我如何为OS X应用程序表示Hang报告?

Raf*_*ael 9

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

  1. 在Xcode中查找在管理器中崩溃的应用程序的相应存档,并在Finder中显示它(右键单击).
  2. 右键单击存档并选择Show Package Contents.
  3. 将目录中的*.appfrom Products和相应*.dSYM文件复制dSYMs到新文件夹中,例如,在桌面上.您将在新文件夹中拥有MyApp.appMyApp.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
    
    Run Code Online (Sandbox Code Playgroud)

0x107b0f000**包围的地址是我们的加载地址,您应该复制.

  1. 接下来,我们需要找到我们想要查找符号信息的地址,即获取实际的方法签名和代码行,从而导致挂起.因此,请在"最重要的堆栈"下方的"挂起"报告开头的堆栈中查找应用的名称:

    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]
    [...]
    
    Run Code Online (Sandbox Code Playgroud)

在此示例堆栈跟踪结束时,您会发现MyApp列出两次.复制这两个地址,0x108b1e5f7,0x108b1add8,并关闭该报告.

  1. 现在我们准备好了atos.在终端中输入以下内容并按Return键:

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

    -[MainWindowController loadDidFinish:] (in MyApp) (MainWindowController.m:127)
    -[MainWindowController view:stringForToolTip:point:userData:] (in MyApp) (MainWindowController.m:231)
    
    Run Code Online (Sandbox Code Playgroud)

是的,看起来很有前途!如果atos输出相同的地址,而不是代码行,那就出错了.这里错误的主要来源可能是错误的内存地址,所以请确保您选择了正确的内存地址.

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