17

完全なクラッシュレポートではないスタックトレースを象徴する方法はありますか?

[NSThreadcallStackSymbols]の文字列結果をサーバーに記録しています。これにより、完全にフォーマットされたクラッシュレポートは提供されませんが、記号化されていないスタックトレースのみが提供されます(以下の例)。

私はこれだけを象徴しようとしました。また、同じビルドからの実際のクラッシュレポートのスレッド0スタックトレースを置き換えてみました。どちらも機能しませんでした。アプリアーカイブにビルドのdSYMがあります。ディストリビューションビルドにシンボルを残さずにこれを行う方法はありますか?

0   domino free                         0x00072891 domino free + 465041
1   domino free                         0x000ea205 domino free + 954885
2   domino free                         0x000ea033 domino free + 954419
3   domino free                         0x0007fe55 domino free + 519765
4   domino free                         0x0006f6d5 domino free + 452309
5   domino free                         0x0006f7a3 domino free + 452515
6   domino free                         0x0006fb9b domino free + 453531
7   Foundation                          0x30558c29 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0 + 16
8   Foundation                          0x304b06d9 -[NSURLConnectionInternalConnection invokeForDelegate:] + 28
9   Foundation                          0x304b06a3 -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 198
10  Foundation                          0x304b05c5 -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 60
11  CFNetwork                           0x31f297f5 _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 192
12  CFNetwork                           0x31f1e4a5 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 424
13  CFNetwork                           0x31f1e599 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 668
14  CFNetwork                           0x31f1e1a3 _ZN19URLConnectionClient13processEventsEv + 106
15  CFNetwork                           0x31f1e0d9 _ZN17MultiplexerSource7performEv + 156
16  CoreFoundation                      0x30abead3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
17  CoreFoundation                      0x30abe29f __CFRunLoopDoSources0 + 214
18  CoreFoundation                      0x30abd045 __CFRunLoopRun + 652
19  CoreFoundation                      0x30a404a5 CFRunLoopRunSpecific + 300
20  CoreFoundation                      0x30a4036d CFRunLoopRunInMode + 104
21  GraphicsServices                    0x30e7f439 GSEventRunModal + 136
22  UIKit                               0x3123acd5 UIApplicationMain + 1080
23  domino free                         0x0004fd3b domino free + 322875
24  domino free                         0x00004004 domino free + 12292
4

4 に答える 4

6

これはかなり古い質問であることは知っていますが、現在同じ問題があり、答えを見つけるのにかなりの時間がかかったので、(どこかに) 文書化する必要があると思いました。

スタック トレースの元になるアプリ バージョンの dSYM がある場合は、実際にそれを有用なものに変えることができます。ここでこの回答を読むと、この記事につながり、非常に役立ちました。スタック トレースの一番上に次の行がありました。

0    MyApp                           0x000000010010da68 MyApp + 236136
                                     ^ stack address            ^ symbol offset

ここから 2 つのオプションがあり、どちらも数学が必要です。一緒に行く場合atosは、一度計算するだけで、1 回の呼び出しですべてのステップを調べることができます。

使用するatos

使用するには、スタック トレースからのスタック アドレスatosが必要であり、計算によってロード アドレスを見つける必要があります。

  1. スタックアドレス値からシンボルオフセット値を差し引いてロードアドレス値を計算します(= - )もちろん、それらを同じベースに変換する必要があります。load addressstack addresssymbol offset

    私の場合はこれでした0x1000D4000

  2. スタック トレースのロード アドレススタック アドレスatosを使用して、スタックトレースエントリを検索します。atos -arch <architecture> -o <path to executable inside (!) the dSYM> -l <load address> <stack address 1> <stack address 2> ...

    私の場合はこれでしたatos -arch arm64 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp -l 0x1000D4000 0x000000010010da68

dSYM 内の実際の実行可能ファイルへのパスを提供する必要があることに注意してください。そうしないと、エラー メッセージが表示されるだけです。でこれらすべてを行うことの良い点atosは、スタック トレースからすべてのアドレスをリストするだけで、一度に読み取り可能な形式を取得できることです。

使用するdwarfdump

使用するには、スタック トレースのスタック アドレスに対応するファイル アドレスdwarfdumpが必要です。

  1. スタック トレースが由来するアーキテクチャのスライド値を見つけます (リンクされた記事のスライド値の取得を参照してください)。

    私の場合、これは0x10000000064ビット用でした。

  2. シンボルのオフセット値 (私の場合、スタック トレースのMyApp + ...の直後の数値236136) を 16 進数に変換し、結果をスライド値に追加します。今取得した数字をファイルアドレスと呼びます( file address= symbol offset+ slide)

    私の場合、これは0x100039A68.

  3. ファイルアドレスdwarfdump使用してスタックトレースエントリを検索しますdwarfdump --lookup <file address> --arch <architecture> <path to dSYM>

    私の場合はこれでしたdwarfdump --lookup 0x100039A68 --arch arm64 MyApp.dSYM

于 2016-09-20T12:41:34.987 に答える
3

私は同じ問題に遭遇し、この答えは私のために働いた: https://stackoverflow.com/a/4954949/299262

dSYM がある限り、atos を使用して個々のアドレスを記号化できます。

コマンド例:

atos -arch armv7 -o 'app name.app'/'app name' 0x000000000

于 2012-09-28T18:11:38.530 に答える
0

これは不可能だと思います。[NSThread callStackSymbols] 関数のメモリ アドレスを返します。クラッシュ直後にメモリをダンプしないとシンボル化できません。クラッシュ時のアドレスはデバイスごとに異なります。1 つのデバイスでも、電話機を再起動すると、別のクラッシュの後にアドレスが変更されました。何人かがatosについて言及しましたが、これはクラッシュログ用であり、callStackSymbols用ではありません。

于 2015-12-08T07:52:24.273 に答える