アプリの 1 つ (リリース バージョン) が応答しなくなったため、強制終了する必要がありました。
OS X がハング レポート(クラッシュ レポートなし) を表示し、それを *.crash ファイルにコピーしました。
HockeyApp などのサービスを使用したりatos
、クラッシュ レポートを直接シンボル化できることは認識していますが、OS X アプリのハング レポートをシンボル化するにはどうすればよいですか?
アプリの 1 つ (リリース バージョン) が応答しなくなったため、強制終了する必要がありました。
OS X がハング レポート(クラッシュ レポートなし) を表示し、それを *.crash ファイルにコピーしました。
HockeyApp などのサービスを使用したりatos
、クラッシュ レポートを直接シンボル化できることは認識していますが、OS X アプリのハング レポートをシンボル化するにはどうすればよいですか?
しばらくして、通常のクラッシュ レポートとは少し異なるハング レポートの処理方法を見つけました。これが私がしたことです:
Show Package Contents
。*.app
からデスクトップなどの新しいフォルダにコピーします。新しいフォルダーにMyApp.appとMyApp.app.dSYMがあります。ファイルの命名は重要です。Products
*.dSYM
dSYMs
ls
ターミナル経由で新しいフォルダーに。ツール (「数値アドレスをバイナリ イメージまたはプロセスのシンボルに変換する」) を使用atos
するには、最初に実行時のアプリの読み込みアドレスと、アプリがハングしている間のスタック フレームのアドレスを特定する必要があります。
ハング レポートを開き、行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
** で囲まれたアドレスは、コピーする必要がある私たちのロード アドレスです。
次に、シンボル情報を検索したいアドレスを検索する必要があります。つまり、ハングの原因となった実際のメソッド シグネチャとコード行を取得する必要があります。したがって、ハング レポートの先頭にあるスタックで、「最も重いスタック」の下にあるアプリの名前を調べます。
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 が 2 回リストされていることがわかります。0x108b1e5f7
、 、の両方のアドレスをコピーして0x108b1add8
、レポートを閉じます。
これで を使用する準備が整いましたatos
。ターミナルで次のように入力し、Return キーを押します。
atos -o MyApp.app/Contents/MacOS/MyApp -arch x86_64 -l 0x107b0f000 0x108b1e5f7 0x108b1add8
atos
同じディレクトリ内の *.dSYM ファイルを使用してアドレスを記号化し、うまくいけば次のような出力が得られます。
-[MainWindowController loadDidFinish:] (in MyApp) (MainWindowController.m:127)
-[MainWindowController view:stringForToolTip:point:userData:] (in MyApp) (MainWindowController.m:231)
ええ、それは有望に見えます! コード行ではなく、入力したのと同じアドレスを出力する場合atos
は、何か問題が発生しています。ここでのエラーの主な原因はおそらく間違ったメモリ アドレスであるため、正しいアドレスを選択したことを確認してください。
さらに質問がある場合はお知らせください (@raffael_me)。