クラッシュログXcodeを象徴する方法は?


188

Xcode 5のオーガナイザーには、すべてのクラッシュログを一覧表示するビューがありました。ここにドロップクラッシュログをドラッグできます。しかし、Xcode 6以降、デバイスが整理されていないため、新しいウィンドウが表示されるようになりました。しかし、Xcode 6にアップグレードした後、Xcode 5にドラッグアンドドロップしたクラッシュログを表示する場所が見つかりません。誰かが答えを知っていますか?


3
私は今月Apple開発者フォーラムで質問したが、答えは得られなかった。これは、有用な機能の喪失です。アップルにバグレポートを提出して、この機能を元に戻すよう依頼してください。
rmaddy 2014

1
私は週末にこれをまとめて、iOSとOSXの両方のクラッシュダンプのシンボリックを解決しました。それはまだ非常に荒いですが、動作するはずです。github.com/agentsim/Symbolicator
Tim

4
Xcode、あなたが想定しているようなAppleのレビュアーからのクラッシュログを象徴的に示してください...これを行う方法を文字通り終日考えているのではなく、
William Entriken 2017年

回答:


119

わかりました、これを行うことができます:

  1. Xcode > Window > Devices、接続されているiPhone / iPad / etcを左上で選択します。
  2. デバイスログの表示
  3. すべてのログ

おそらくそこには多くのログがあり、インポートされたログを後で見つけやすくするために、この時点ですべてのログを削除することができます。または、クラッシュが発生した正確な時点を知らない限り-とにかくファイルに書き込む必要があります...私は怠惰なので、すべての古いログを削除します(これには実際には時間がかかりました)。

  1. ファイルをそのリストにドラッグアンドドロップするだけです。それは私のために働いた。

13
同じ問題が発生していますが、問題は解決していません。ウィンドウにドラッグアンドドロップしたログが表示されますが、シンボリックではありません。
Arkaaito 2014

9
トリックは、デバイスを接続し、リストからデバイスを選択する必要があることです。デバイスなしでは実現できないと思います。
Jonny 2014

59
クラッシュファイルをそのリストにドラッグできるようにするには、拡張子を付ける必要があり.crashます。
pjay_ 2014年

7
私にとって欠けている手順は、ファイルがドロップされたら、ファイルを右クリックしてログを再シンボリックする必要がありました
RobCroll

6
オーガナイザー内のアーカイブ用に「dSYMをダウンロード」することを忘れないでください。
123FLO321 2017

259

私自身と同じくらいコミュニティのためにこの答えを書いてください。

クラッシュレポートを表す問題が発生した場合は、次のようにして問題を解決できます。

  1. コピーし、別のフォルダを作成Foo.appし、Foo.app.dSYM対応するから.xcarchiveフォルダに。また、.crashレポートをフォルダーにコピーします。

  2. TextEditまたは他の場所でクラッシュレポートを開き、Binary Images:セクションに移動して、そこに最初のアドレスをコピーします(例:)0xd7000

  3. cdフォルダに。これで、次のコマンドを実行できます。

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

これは、アドレスのシンボルを示します0x0033f9bb-archオプションの正しい値を選択してください(Binary Images:セクションの最初の行から削除するかHardware Model:、クラッシュレポートとアプリでサポートされているアーチから把握できます)。

クラッシュレポートから必要なアドレス(スレッドコールスタックなど)を直接テキストファイルにコピーして(TextEditでは、Optionキーを押しながら必要なテキストブロックを選択するか、コピーして切り取る)、次のようなものを取得することもできます。

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

これをテキストファイル(例:)に保存しaddr.txt、次のコマンドを実行します。

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

これは、一度にすべてのアドレスに素晴らしいシンボリックを与えます。

PS

上記を行う前に、すべてが正しく設定されていることを確認することをお勧めします(atos基本的に提供されたアドレスについて何かを喜んで報告します)。

チェックを行うには、クラッシュレポートを開き、の呼び出しスタックの最後に移動しますThread 0。アプリのリストの最初から1行目(通常は2行目)、例:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

main()呼び出しでなければなりません。0x0033f9bb上で説明したように(この場合)アドレスを記号化すると、これが実際にmain()ランダムな方法や関数ではなく、実際にあることを確認できます。

アドレスがのアドレスでない場合はmain()、ロードアドレス(-lオプション)とアーチ(-archオプション)を確認してください。

PPS

上記のために仕事をしない場合はビットコード、dSYM(ファインダー>パッケージの内容を表示)から実行可能なバイナリを抽出し、iTunesの接続からのビルドのためのdSYMをダウンロードしたディレクトリにコピーし、それ(すなわちを使用しFooて)のatos代わりにへの引数Foo.app/Foo


2
mini xcrunチュートリアルを書いて、サニティチェックセクションで更新する手間をかけてくれてありがとう。私の正気は、多くの宣誓の後で救われ、目に見える象徴はありません
アントン・トロパシュコ2014年

10
クラッシュレポートが実行可能ファイルおよびdSYMと一致することを検証することを忘れないでください。これを確認するには、バイナリイメージセクションの下の<>内の識別子を、実行によって実行可能ファイルから返された識別子と照合しますxcrun dwarfdump --uuid <path to executable>
Ryan C. Payne

2
アプリ(Foo)のシンボルのみが表示されることに注意することが重要です。Foundationなどの外部ライブラリ/フレームワーク、またはlibsystem_kernel.dylibからのシンボルには表示されません。
jlukanta 2015

1
これは役に立ちますが、それでも私にはうまくいきません。私が問題を抱えているのは、0xd7000情報がないことです。私の行はこのような0x100038328 __mh_execute_header + 99112のように見えます。__mh_execute_headerとは何ですか?私は他にすべてを持っています
skinsfan00atg 2015年

5
私はあなたのためにほとんどの仕事をする簡単なbashスクリプトを書きました。使用法:./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash 完全なクラッシュレポートを象徴し、それを象徴したバージョンを提供します。 gist.github.com/nathan-fiscaletti/…–
Nathan F.

186

これも参照できます。手動クラッシュの再記号化の手順を順を追って説明しました。

クラッシュの再記号化

ステップ1

上記のすべてのファイル(MyApp.app、MyApp-dSYM.dSYMおよびMyApp-Crash-log.crash)を、Terminalを使用して簡単に移動できる場所に、便利な名前のフォルダーに移動します。

私にとって、デスクトップは最も簡単にアクセスできる場所です;)そこで、これらの3つのファイルをデスクトップのMyAppフォルダーに移動しました。

ステップ2

今度はFinderの番です。XCODEバージョンに該当する次のいずれかのパスに移動します。

このコマンドを使用して、symbolicatecrashスクリプトファイルを見つけます。
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8、Xcode 9、Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Xcode 6より低い Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

または Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

ステップ3

見つかったsymbolicatecrashスクリプトファイルのディレクトリを次の$PATHようにenv変数に追加し、スクリプトファイルのディレクトリをsudo vim /etc/paths.d/Xcode-symbolicatecrash貼り付けてファイルを保存します。新しいターミナルを開くと、にsymbolicatecrashあるコマンドとして任意のフォルダーを呼び出すことができます/usr/bin

または

この場所からsymbolicatecrashファイルをコピーして、デスクトップ/ MyAppに貼り付けます(待ってください…私を盲目的にフォローしないでください。MyAppフォルダにsybolicatecrashファイルを貼り付けています。これは、ステップ1で作成したお気に入りの場所に3つのファイルがあります。 )

ステップ4

ターミナルを開き、MyAppフォルダに移動します。

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 —  Enterキーを押します

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 —  Enterキーを押します

それでおしまい !!シンボリックログが端末にあります...何を待っていますか?簡単に言うと、エラーを見つけて解決します;)

ハッピーコーディング!!!


2
@EmilVikström:提案をありがとう、答えを更新しました。
Mrug

2
エクスポートDEVELOPER_DIR =を使用xcode-select --print-path
Parag Bafna

8
御馳走を働いた-ありがとう。export DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer(引用符なし)を使用しなければならなかったことが1つだけあります。
goelectric 2015

1
"export DEVELOPER_DIR = xcode-select --print-path"と言うだけで "-bash:export:` --print-path ':not a valid identifier
Almo

2
更新; ここにあります ; xcode7の場合、symbolicatecrashをここで見つけます。/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrashスタックごとのオーバーフロー.com / questions / 32804611 /…
AnneTheAgile 2016年

27

私にとっては.crashファイルで十分でした。.dSYMファイルと.appファイルなし。

私はMacで次の2つのコマンドを実行し、アーカイブを作成しました。

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash

ワオ。これが.dsymファイルなしでどのように機能するかはわかりませんが、機能します!
rustyMagnet

4
@rustyMagnetそれが機能する方法は、コンピューター上のアーカイブされたビルドからのdsymsを使用することです。
Andrey Tarantsov

1
ええ、これはXcodeでアーカイブしたビルドでのみ機能し、クラッシュログをシンボル化するアドホック実行用に生成した他のビルドでは機能しません。
CMash

21

Xcodeを使用する簡単な方法があります(コマンドラインツールを使用せず、一度に1つずつアドレスを検索しません)。

  1. .xcarchiveファイルを取得します。以前から持っていればそれを使うことができます。ない場合は、[製品]> [Xcodeからアーカイブ]を実行して作成します。

  2. .xcarchiveファイルを右クリックして、[パッケージの内容を表示]を選択します。

  3. (クラッシュしたアプリのバージョンの)dsymファイルをdSYMsフォルダーにコピーします

  4. (クラッシュしたアプリのバージョンの).appファイルをProducts> Applicationsフォルダにコピーします

  5. Info.plistを編集し、ApplicationPropertiesディクショナリの下のCFBundleShortVersionStringおよびCFBundleVersionを編集します。これは後でアーカイブを識別するのに役立ちます

  6. .xcarchiveをダブルクリックしてXcodeにインポートします。オーガナイザーが開きます。

  7. クラッシュログに戻ります(Xcodeの[デバイス]ウィンドウ内)

  8. .crashファイルをそこにドラッグします(まだ存在しない場合)。

  9. クラッシュログ全体がシンボリックされているはずです。そうでない場合は、右クリックして[クラッシュログの再記号化]を選択します。


1
あなたの答えは正しく簡単です。ターミナルアプリを使用する必要はありません。一部のContinuous-Integrationシステムには、.app.dSYMフォルダーのzipボールの代わりに.xcarchiveファイルがないため、.xcarchiveフォルダーの再作成は非常に重要です。偶然にも、私が昨日やったことはあなたが言ったのとまったく同じです。
DawnSong 2016年

完全な出力はどのようになりますか?
noobsmcgoobs

xcarchiveはクラッシュしたアプリのバージョン用なので、これはステップ3-5をスキップしましたが、これはクラッシュログを部分的に表しています。
Declan McKenna 2016年

1
もちろんそれはあなた自身のコードを象徴するだけです-あなたが使用したかもしれない外部ライブラリコードではありません。
RPM

7

Xcode 10で次の手順に従って、同じマシンでビルドされたアプリからのクラッシュログを象徴します。

  1. Organizer内で、アプリのベースとなっているアーカイブを見つけます。
  2. [ デバッグシンボルダウンロード ]ボタンをクリックします。ダウンロードフォルダーには何も表示されませんが、問題ありません。
  3. ビルドマシンをiOSデバイスに接続します。
  4. [ デバイスとシミュレータ]デバイスを選択します。
  5. [ デバイスログの表示]ボタンをクリックします。
  6. クラッシュファイルを左側のパネルにドラッグアンドドロップします。ファイルの拡張子は.crashである必要があります。そうでない場合、ドラッグは失敗します。
  7. [ すべてのログ ]タブに切り替えます。
  8. 追加したクラッシュファイルを選択します。
  9. ファイルは自動的にシンボリックになります。それ以外の場合は、右クリックのコンテキストメニュー項目[ 再シンボリックログ]を使用します。

最初は、これが他の投稿に何かを追加しているとは思いませんでしたが、最初の2つのステップ、特に「デバッグシンボルのダウンロード」が欠けているようです。ありがとうございました。
クリストファーキング

6

.dSYMファイルと.crashファイルが同じサブフォルダーにある場合、次の手順を実行できます。

  1. .crashファイルのバックトレースを見て、2列目にはバイナリイメージの名前を、3列目にはアドレスをメモします(たとえば、以下の例では0x00000001000effdc)。
  2. バックトレースのすぐ下の「バイナリイメージ」セクションで、イメージ名、アーキテクチャ(arm64など)、およびバイナリイメージ(TheElementsなど)のロードアドレス(以下の例では0x1000e4000)に注意してください。
  3. 以下を実行します。

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

信頼できるソース:https : //developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS


3

Xcodeアプリケーション名にスペースが含まれていないことを確認してください。これがうまくいかなかった理由です。そう/Applications/Xcode.appしながら、作品/Applications/Xcode 6.1.1.appの仕事をしません。


やってみました?そうでない場合は、コメントに意味があるかどうかを確認してください。
Bouke

1
それは私が話しているのと同じ問題ではありません。Xcodeは、インストール後、最初に使用する前に名前を変更できます。ただし、シンボリック用のスクリプトはアプリケーション名のスペースを処理できず、失敗します。
Bouke

1
@ChuckKrutsinger実際に試しましたか?エスケープされたスペースを使用するとスクリプトを実行できますが、スクリプト自体は失敗します。スクリプトはおそらく、エスケープされたスペースで他のスクリプトを呼び出しません。
Bouke、2015

1
@ChuckKrutsingerこれはとてもすばらしいことですが、Xcodeにクラッシュログを自動的に記号化させたい場合は、最後に私の答えが必要になります。
Bouke、2015

1
boukeが正しいことと、Xcodeアプリのパスにスペースが含まれている場合、Xcodeがクラッシュログの再シンボリック化に使用するスクリプトが機能しないことを繰り返し説明します。手動による再シンボリケーションとは関係ありません。
Gary Makin

3

Xcode 11.2.1、2019年12月

Appleは.txt形式でクラッシュログを提供しますが、これは記号化されていません

**

デバイスが接続されている

**

  • 「.txt」ファイルをダウンロードし、拡張子を「.crash」に変更します ここに画像の説明を入力してください
    • Xcodeのウィンドウタブからデバイスとシミュレーターを開く
    • デバイスを選択し、デバイスログを選択
    • .crashファイルをデバイスログウィンドウにドラッグアンドドロップする

ここに画像の説明を入力してください

あそこに象徴的なクラッシュログが表示されます

クラッシュログのシンボリック化の詳細については、リンクを参照してください


2

Appleのドキュメントから:

Xcodeによるクラッシュレポートの記号化Xcodeは、発生したすべてのクラッシュレポートを自動的に記号化しようとします。シンボリケーションに必要なのは、クラッシュレポートをXcode Organizerに追加することだけです。

  • iOSデバイスをMacに接続する
  • 「ウィンドウ」メニューから「デバイス」を選択します
  • 左側の列の[デバイス]セクションで、デバイスを選択します
  • 右側のパネルの「デバイス情報」セクションの下にある「デバイスログの表示」ボタンをクリックします
  • 表示されたパネルの左側の列にクラッシュレポートをドラッグします
  • Xcodeは自動的にクラッシュレポートを象徴し、結果を表示しますクラッシュレポートを象徴するために、Xcodeは以下を見つけることができる必要があります:

    1. クラッシュするアプリケーションのバイナリとdSYMファイル。

    2. アプリケーションがリンクするすべてのカスタムフレームワークのバイナリとdSYMファイル。アプリケーションのソースから構築されたフレームワークの場合、それらのdSYMファイルは、アプリケーションのdSYMファイルと一緒にアーカイブにコピーされます。サードパーティによって構築されたフレームワークの場合、作成者にdSYMファイルを要求する必要があります。

    3. アプリケーションがクラッシュしたときにそのアプリケーションが実行されていたOSの記号。これらのシンボルには、特定のOSリリース(iOS 9.3.3など)に含まれるフレームワークのデバッグ情報が含まれています。OSシンボルはアーキテクチャ固有です。64ビットデバイス向けiOSのリリースには、armv7シンボルは含まれません。Xcodeは、Macに接続する各デバイスからOSシンボルを自動的にコピーします。

これらのいずれかが欠落している場合、Xcodeはクラッシュレポートをシンボル化できないか、クラッシュレポートを部分的にシンボル化する可​​能性があります。


2

クラッシュログを象徴する最も簡単なプロセス:

  1. 今後の使用のために、IPA構築プロセス中にオーガナイザーからのxcarchiveファイルを保持します。
  2. クラッシュが発生したら、影響を受けるデバイスからクラッシュログを収集します。拡張子は.crashである必要があります。クラッシュログが.ips形式の場合は、名前を.crashに変更します。
  3. 保存されたパスからxcarchiveをダブルクリックして、オーガナイザーに表示します(まだ存在しない場合)。
  4. xcodeウィンドウで開く->デバイスとシミュレータ->デバイスログを表示->すべてのログ-> .crashファイルをドラッグアンドドロップします。

5秒待ちます。バン!スタックトレースのアプリケーション呼び出しがシンボリック表示されます!ただし、まだ多くのシンボルが表示される場合があります。これらは内部ライブラリとフレームワークの呼び出しです。

これは、試してテストした最も簡単な方法です。


1

Appleは.txt形式でクラッシュログを提供しますが、これは記号化されていません

**

デバイスが接続されている

**

  • 「.txt」ファイルをダウンロードし、拡張子を「.crash」に変更します ここに画像の説明を入力してください
    • Xcodeのウィンドウタブからデバイスとシミュレーターを開く
    • デバイスを選択し、デバイスログを選択
    • .crashファイルをデバイスログウィンドウにドラッグアンドドロップする

ここに画像の説明を入力してください

あそこに象徴的なクラッシュログが表示されます

クラッシュログのシンボリック化の詳細については、リンクを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.