2

Mac App Store アプリからのスタック トレースがあります。これを読んで、ユーザーが経験している問題を診断するのに役立てたいと思います。dSYM ファイルと元のアーカイブ ビルドはありますが、完全なクラッシュ レポートはありません。私が知りたいのは、スタック トレース内のメソッドの名前だけです (以下のMyAppNameで 2 つのメソッドを確認できます)。私はこの情報を入手することlldbも、提供することもできませんでした。atosスタック トレースは次のようになります。

0   CoreFoundation                      0x00007fff92fdd25c __exceptionPreprocess + 172
1   libobjc.A.dylib                     0x00007fff918dbe75 objc_exception_throw + 43
2   CoreFoundation                      0x00007fff92ebb4f5 -[__NSArrayM objectAtIndex:] + 245
3   MyAppName                           0x0000000108e91c6b MyAppName + 126059
4   MyAppName                           0x0000000108e7556f MyAppName + 9583
5   AppKit                              0x00007fff8d883099 -[NSToolbarButton sendAction:to:] + 75
6   AppKit                              0x00007fff8d8830e8 -[NSToolbarButton sendAction] + 65
7   AppKit                              0x00007fff8d436f0c -[NSToolbarItemViewer mouseDown:] + 4897
8   AppKit                              0x00007fff8d352a58 -[NSWindow sendEvent:] + 11296
9   AppKit                              0x00007fff8d2f15d4 -[NSApplication sendEvent:] + 2021
10  AppKit                              0x00007fff8d1419f9 -[NSApplication run] + 646
11  AppKit                              0x00007fff8d12c783 NSApplicationMain + 940
12  libdyld.dylib                       0x00007fff87df35fd start + 1
13  ???                                 0x0000000000000001 0x0 + 1

シンボルを取得するには (たとえば、上記のレベル 3 の場合)、どのコマンドを使用できますか? を呼び出したときlldb、126059 がレベル 3 にある場合、16 進アドレスとオフセットのどちらを使用する必要があるかさえ明確ではありませんでした。

アップデート

atosドキュメントによると、次のように呼び出す必要があるようです。

xcrun atos -arch x86_64 -o MyAppName.app/Contents/MacOS/MyAppName -l <LOADED ADDRESS> 0x0000000108e91c6b

しかし、ロードされたアドレスとして何を使用しますか? 私が持っているのは、上に貼り付けたものだけです。0x00000000000000010x00007fff87df35fd、または-l完全に省略しても、 0x0000000108e91c6b(指定したアドレス) が標準出力に出力されます。

4

1 に答える 1

1

スタック トレースをダンプするほとんどのツール (特に CrashReporter) では、レポートの下部に、現在プログラムに読み込まれているすべての画像、それらの UUID およびそれらの読み込みアドレスを含むセクションがあります。UUID と UUID を照合できるため、常にスタック トレースと共にその情報を取得する必要があります。 dSYM またはバイナリで。

ただし、トレースの「シンボル名 + オフセット」の部分を使用してロード アドレスを特定できる場合があります。通常、この最後の列は、そのバイナリで最も近いストリップされていないシンボルからのバックトレース内のアドレスのオフセットです。したがって、保存されているバイナリでそのシンボルのアドレスを見つけ、そのアドレスにオフセットを追加し、上の 3 列目にリストされているアドレスからそれを減算するだけです。lldb では、以下を使用してシンボルのアドレスを見つけることができます。

(lldb) image lookup -n <SymbolName>

その計算により、デフォルトのロードアドレスからのバイナリの「スライド」が得られます。次に、バイナリで lldb を実行し、次のようにします。

(lldb) image load -f MyAppName -s <Calculated Slide>

これで、次を使用して、スタック トレースで MyAppName からアドレスを検索できます。

(lldb) image lookup -va <ADDRESS>

ただし、メインの実行可能ファイルは、通常、システムの他のコンポーネントが使用するシンボルを提供しないため、通常は完全に削除されます。そのため、シンボルは一切残っていません。その場合、上記のリストの MyAppName は、バイナリの __TEXT.__text セクションにすぎないと思いますが、100% 確実ではありません。とにかく、それが正しければ、バイナリをlldbにロードして実行することで、そのセクションのデフォルトのロードアドレスを見つけることができます:

(lldb) image dump sections MyAppName

次に、上記と同じ計算を行います。

于 2014-10-22T17:21:08.940 に答える