私は自分のiPhoneアプリのクラッシュレポートを試して象徴化しようとしている。
私はiTunes Connectからクラッシュレポートを取得しました。 App Storeに送信したアプリケーションバイナリがあり、ビルドの一部として生成されたdSYMファイルがあります。
これらのファイルはすべて、スポットライトで索引付けされている単一のディレクトリ内にまとめてあります。
今何ですか?
私は起動しようとしました:
symbolicatecrash crashreport.crash myApp.app.dSYM
そしてそれは単にクラッシュレポートにあるのと同じテキストを出力します。
私は何か悪いことをしていますか?
アップルからのクラッシュレポートを分析する手順:
アプリストアにプッシュされたrelease .appファイル、リリース時に作成された.dSYMファイル、およびクラッシュレポートがAppleから受信したフォルダにコピーします。
端末アプリケーションを開き、上で作成したフォルダに移動します(cd
コマンドを使用)。
atos -Arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
を実行してください。メモリの場所は、レポートに従ってアプリがクラッシュした場所にする必要があります。
例:atos -Arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
これは正確な行、つまりクラッシュを引き起こしたメソッド名を示すでしょう。
例:[classname functionName:]; -510
シンボリックIPA
シンボリックにIPAを使用している場合は、拡張子.ipaの名前を.Zipに変更して展開し、アプリを含むペイロードフォルダーを取得できます。この場合、.dSYMファイルは必要ありません。
注
これは、アプリのバイナリからシンボルが削除されていない場合にのみ機能します。デフォルトでは、リリースビルドはシンボルを取り除きました。プロジェクトビルド設定の「コピー中にデバッグシンボルを削除する」でNOに変更できます。
詳細はこちら をご覧ください。投稿
クラッシュログを象徴するためにここでこれらすべての答えを読んだ(そして最後に成功した)後に、symbolicatecrashの呼び出しが象徴的な出力を生成しない理由を判断するために本当に重要ないくつかの不足点があると思います。
クラッシュログを象徴するとき、一緒に収まらなければならない3つの資産があります。
example.crash
)。XCodeのオーガナイザーからエクスポートされるか、またはiTunes Connectから受信されます。.app
パッケージ(つまりexample.app
)。 .ipa
パッケージ(つまりexample.ipa
)がある場合は、.app
パッケージ(つまり.ipa
)を解凍することでunzip example.ipa
パッケージを抽出できます。その後、.app
パッケージは抽出されたPayload/
フォルダーにあります。.dSYM
パッケージ(すなわちexample.app.dSYM
)記号化を開始する前に、これらのアーティファクトがすべて一致するかどうかを確認する必要があります。つまり、クラッシュログは自分が持っているバイナリに属し、デバッグシンボルはそのバイナリのビルド中に生成されるものです。
各バイナリはクラッシュログファイルで確認できるUUIDによって参照されます。
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
この抽出では、クラッシュログはexample.app/exampleという名前のアプリバイナリイメージ(UUIDがaa5e633efda8346cab92b01320043dc3
)に属しています。
Dwarfdumpであなたが持っているバイナリパッケージのUUIDをチェックすることができます。
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
その後、あなたもあなたが持っているデバッグシンボルがそのバイナリに属しているかどうかをチェックするべきです:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
この例では、すべてのアセットがぴったり合っているので、スタックトレースを象徴することができるはずです。
symbolicatecrash
スクリプトに進む。
Xcode 8.3では、次のようにしてスクリプトを起動できるはずです。
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
見つからない場合は、Xcode.appディレクトリでfind . -name symbolicatecrash
を実行して見つけます。
ご覧のとおり、これ以上パラメータはありません。そのため、スクリプトはスポットライト検索を実行してアプリケーションのバイナリシンボルとデバッグシンボルを見つける必要があります。 com_Apple_xcode_dsym_uuids
という特定のインデックスでデバッグシンボルを検索します。あなたは自分でこの検索をすることができます:
mdfind 'com_Apple_xcode_dsym_uuids = *'
それぞれ。
mdfind "com_Apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
最初のSpotlightの呼び出しで、インデックスが付けられたすべてのdSYMパッケージが得られ、2番目のスポットライトでは、特定のUUIDを持つ.dSYM
パッケージが得られます。 spotlightがあなたの.dSYM
パッケージを見つけられないならば、symbolicatecrash
もそうではありません。あなたがすべてのこのようなものをやればあなたの~/Desktop
スポットライトのサブフォルダにすべてを見つけることができるはずです。
symbolicatecrash
があなたの.dSYM
パッケージを見つけた場合、symbolicate.log
に以下のような行があるはずです。
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
.app
パッケージを見つけるために、以下のようなスポットライト検索がsymbolicatecrash
によって呼び出されます。
mdfind "kMDItemContentType == com.Apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
symbolicatecrash
があなたの.app
パッケージを見つけた場合、symbolicate.log
に以下の抜粋があるはずです。
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
これらすべてのリソースがsymbolicatecrash
によって見つかった場合は、クラッシュログのシンボルバージョンを表示する必要があります。
そうでない場合は、dSYMファイルと.appファイルを直接渡すことができます。
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
注:シンボリックバックトレースはsymbolicate.log
ではなくterminalに出力されます。
最新バージョンのXcode(3.2.2)では、クラッシュレポートをXcode Organizerの[Device Logs]セクションにドラッグアンドドロップできます。それらは自動的にシンボル表示されます。 Build&Archive(Xcode 3.2.2の一部でもあります)を使ってそのバージョンのAppをビルドした場合、これが最もうまくいくと思います。
次の手順に従って、これを成功させました。
ステップ1:デスクトップにフォルダを作成し、「CrashReport」に名前を付けて3つのファイルを置きます(「MYApp.app」、「MyApp.app」その中の.dSYM "、" MYApp_2013-07-18.crash ")。
ステップ2:Finderを開いてApplicationsを開き、Xcodeアプリケーションを見つけて右クリックし、その後「Show Package Contents」をクリックします。この単純な道をたどってください。 "コンテンツ - >開発者 - >プラットフォーム - > iPhoneOS.platform->開発者 - >ライブラリ - > PrivateFrameworks - >DTDeviceKit.framework - >バージョン - > A->リソース」
OR
"コンテンツ - >開発者 - >プラットフォーム - > iPhoneOS.platform->開発者 - >ライブラリ - > PrivateFrameworks - >DTDeviceKitBase.framework - >バージョン - > A->リソース」
OR
Xcode 6以上の場合、パスはApplications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resourcesです。
"symbolicatecrash"ファイルが見つかったら、これをコピーして "CrashReport"フォルダに貼り付けます。
ステップ3:端末を起動し、これら3つのコマンドを実行します
cd/Users/mac38/Desktop/CrashReportそしてEnterボタンを押す
dEVELOPER_DIR = "/ Applications/Xcode.app/Contents/Developer"をエクスポートしてEnterキーを押します。
XCODE 9に更新されました
任意のiOSデバイスをあなたのMacに接続します(はい、物理的なものです、はい、これは愚かなことを知っています)
左側のデバイスをクリックし、右側の[デバイスリストを表示]をクリックします 。
待つ。表示されるまで少し時間がかかる場合があります。たぶんCommand-A
そしてDelete
を実行するとこれがスピードアップします。
文書化されていない重要なステップ:iTunesConnectから取得したクラッシュレポートを.txt
拡張子から.crash
拡張子に名前変更
そしてXcodeはクラッシュレポートを象徴し結果を表示します。
ソース: https://developer.Apple.com/library/ios/technotes/tn2151/_index.html
シンボリッククラッシュを実行する前に、dsym、アプリバンドル、クラッシュログを同じディレクトリにまとめます。
それからシンボリッククラッシュの実行を簡単にするために、私の.profileで定義されたこの関数を使用します。
function desym
{
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}
そこに追加された引数はあなたを助けるかもしれません。
次のコマンドを実行して、スポットライトがあなたのdysmファイルを「見る」ことを確認するためにチェックすることができます。
mdfind 'com_Apple_xcode_dsym_uuids = *'
あなたのディレクトリにあるdsymを探してください。
注:最新のXcodeの時点で、Developerディレクトリはもうありません。あなたはここでこのユーティリティを見つけることができます:
/アプリケーション/ Xcode.app /コンテンツ/ SharedFrameworks/DTDeviceKitBase.framework /バージョン/ A /リソース/ symbolicatecrash
私は自分のアプリでAirbrakeを使っていますが、これはリモートエラーログのかなり良い仕事をしています。
バックトレースがそれを必要とするならば、私はどのように私がatosでそれらを象徴するかです:
Xcode(4.2)で、オーガナイザーに行き、.ipaファイルが生成されたアーカイブを右クリックしてください。
ターミナルで、cdをxcarchiveに追加します。例えばMyCoolApp 10-27-11 1.30 PM.xcarchive
次のatos -Arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'
を入力してください(一重引用符を忘れないでください)
私はその呼び出しに私のシンボルを含めません。空の行にブロックカーソルが表示されます。
それから私は自分のシンボルコードをコピーしてそのブロックカーソルに貼り付けてEnterを押します。次のように表示されます。
-[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)
ブロックカーソルに戻って、他のシンボルを貼り付けることができます。
最初のビットを再入力せずに1つのアイテムをバックトレースすることができれば、いい時間節約になります。
楽しい!
Xcode 6.1.1に関する単純で更新された答えです。
ステップ
1. Xコード>ウィンドウ>デバイス。
2.デバイスセクションのデバイスリストからデバイスを選択します。
3. [デバイスログの表示]を選択します。
4. [すべてのログ]セクションの下にあるreport.crashを直接ドラッグアンドドロップできます。
5.Xcodeは自動的にクラッシュレポートをシンボル化します。
6. Date/Timeをクラッシュレポートに記載されているDate/Timeと一致させることで、Symbolicatedクラッシュレポートを見つけることができます。
私は数年前からアプリを開発していましたが、これは私が初めてバイナリをデバッグするときで、私はすべてのファイルがどこにあるのかを見つけ出す完全なNOOBのように感じました私はそれを理解するために複数の記事を読む必要がありました。絵は千語の価値があり、私はこの記事が将来他の誰かに役立つことを願っています。
1 - まずitunesconnectに行き、クラッシュログをダウンロードします。注:ほとんどの場合、「レポートを表示するには送信されたレポートが少なすぎます」などの問題が発生する可能性があります。基本的に十分なユーザーがクラッシュログレポートをAppleに提出していないので、その時点では何もできません。
2 - バイナリコードをAppleに提出してからコードを変更していない場合は、そのプロジェクトに対してXcodeを起動し、[Product] - > [Archive]をもう一度実行します。それ以外の場合は、最新の送信済みバイナリを見つけて右クリックしてください。
XCode 4を使用すると、タスクはさらに簡単になります。
そしてvoilà。ログファイルがインポートされ、自動的にシンボル化されます。 XCode - > Product - > Archive firstを使ってビルドをアーカイブした
XCode 4.2.1でOrganizerを開き、Library/Device Logsに移動して、.crashファイルをクラッシュログのリストにドラッグします。それは数秒後にあなたのために象徴されます。元のビルドがアーカイブされていたのと同じXCodeのインスタンスを使用する必要があることに注意してください(つまり、ビルドのアーカイブはOrganizerに存在する必要があります)。
Magical XCode Organizerは、私のアプリを象徴することについてそれほど不思議ではありません。私は失敗したアプリの提出から私がAppleから戻ったというクラッシュレポートのためのシンボルを全く得ませんでした。
クラッシュレポートを.appファイル(ストアに送信したもの)および.dSYMファイルと同じフォルダーに配置して、コマンドラインを使用してみました。
$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
これは私のアプリにシンボルを提供するだけでコアの基礎コードを提供しませんでした、しかしそれはOrganizerが私に与えている数字ダンプより良く、私のアプリが持っていたクラッシュを見つけて修正するのに十分でした。 Foundationのシンボルを取得するためにこれを拡張する方法を誰かが知っていれば、それは高く評価されるでしょう。
私の場合は、クラッシュレポートをMailからOrganizerに直接ドラッグしていました。どういうわけか、クラッシュ報告が象徴的になるのを妨げていました(なぜか知りたいのですが)。
クラッシュレポートを最初にデスクトップにコピーしてから、そこからオーガナイザーにドラッグすると、それらが正しく記号化されていました。
非常に特殊なケース、私は知っています。しかし、私は念のために共有すると思いました。
私のために働いた組み合わせは次のとおりです。
atosを使用するクラッシュレポートに含まれていたアドレスとオフセットで正しいシンボル情報を解決できませんでした。私がこれをしたとき、私はもっと意味のあることを見ます、そしてそれは合法的なスタックトレースのようです。
Airbrakeを使っている人たちのために、上のしっかりした反応がある、しかしそれは微調整なしで私のために働かないだろう:
一部のメモリアドレスでは機能しますが、それ以外では機能しません。理由はわかりません...
ここで私が象徴的なクラッシュに関して抱えているもう一つの問題があります - それは彼らのバンドルの中にスペースを持っているアプリ(すなわち 'Test App.app')ではうまくいきません。注送信時に名前にスペースを含めることはできないと考えられるため、削除する必要がありますが、分析が必要なクラッシュが既にある場合は、symbolicatecrash(4.3 GM)にパッチを適用します。
240c240
< my $cmd = "mdfind \"kMDItemContentType == com.Apple.application-bundle && kMDItemFSName == $exec_name.app\"";
---
> my $cmd = "mdfind \"kMDItemContentType == com.Apple.application-bundle && kMDItemFSName == '$exec_name.app'\"";
251c251
< my $cmd = "find \"$archive_path/Products\" -name $exec_name.app";
---
> my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";
シンボリッククラッシュスクリプトを正しく動作させるには、ハッキングをする必要がありました。
私が言うことができる限りでは、symbolicatecrashは今、.appが.dsymと同じディレクトリにあることを要求します。それは.appを見つけるために.dsymを使いますが、シンボルを見つけるためにdsymを使いません。
これらのパッチを試す前に、シンボルクラッシュのコピーを作成してください。
GetSymbolPathFor_dsymUuid関数の212行目の周り
212 my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
MatchesUUID関数の行265の周り
265 return 1;
これは簡単です。たくさん検索した後、クラッシュログファイル全体を象徴する明確なステップを見つけました。
幸せなコーディング、
リヤズ
私はすべてのクラッシュログを象徴するスクリプトを好みます。
フォルダを作成し、そこに4つのものを置きます。
symbolicatecrash
Perlスクリプト - その場所を示す多くのSO回答があります
クラッシュに一致するビルドのアーカイブ(Xcode Organizerから。Show in Finder
とコピーのように単純なもの)[これが必要なのかわからない]
すべてのxccrashpoint
パッケージ - (Xcode Organizerから。Show in Finder
、ディレクトリ内のすべてのパッケージ、またはシンボリックにしたい単一のxccrashpointをコピーすることができます)
その短いスクリプトをディレクトリに追加します。
#!/bin/sh
echo "cleaning old crashes from directory"
rm -P *.crash
rm -P *.xccrashpoint
rm -r allCrashes
echo "removed!"
echo ""
echo "--- START ---"
echo ""
mkdir allCrashes
mkdir symboledCrashes
find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \;
cd allCrashes
for crash in *.crash; do
../symbolicatecrash $crash > ../symboledCrashes/V$crash
done
cd ..
echo ""
echo "--- DONE ---"
echo ""
スクリプトを実行すると、2つのディレクトリがあります。
allCrashes
- すべてのxccrashpoint
からのすべてのクラッシュが発生します。
symboledCrashes
- 同じクラッシュがすべてのシンボルで発生します。
スクリプトを実行する前に、古いクラッシュからディレクトリを削除する必要はありません。それは自動的にきれいになります。がんばろう!
クラッシュを象徴するために、Spotlightは、あなたがAppleに提出したバイナリと同時に生成された.dSYMファイルを見つけることができなければなりません。これにはシンボル情報が含まれているので、それが利用できない場合は運が悪くなります。
あなたはOSX 10.9以降を実行している場合はatosは廃止されているので、実行する必要があるかもしれません
xcrun atos
警告:/ usr/bin/atosは動いており、将来のOS Xリリースから削除される予定です。 Xcode開発者ツールで利用できるようになりました:
xcrun atos
Textwranglerを使用して、オリジナルのアプリのアップロードバイナリ拒否のエラーを特定します。クラッシュデータは、itunesConnectアカウントにあります。上記のSachinの方法を使用して、original.crashをTextWranglerにコピーし、次に作成したsymbolicatecrashファイルを別のTextWranglerファイルにコピーします。 2つのファイルを比較すると違いがわかります。 symbolicatecrashファイルには、ファイルと問題の行番号を指摘する違いがあります。
私はここでは「ただうまくいく」ように思われないという事実について少し不機嫌に思ったので、私はいくつかの調査をしました、そして結果は以下の通りです。
セットアップ:レポートを受け取るQuincyKitバックエンド。私はそれを機能させるために私がしていることを彼らが何を示唆しているのか理解することさえできなかったので象徴は設定されなかった。
修正:オンラインのサーバーからクラッシュレポートをダウンロードする。それらは「クラッシュ」と呼ばれ、デフォルトでは〜/ Downloads /フォルダに入ります。それを念頭に置いて、このスクリプトは「正しいことをします」そしてクラッシュレポートはXcode(オーガナイザー、デバイスログ)に入り、そして象徴化がされるでしょう。
スクリプト:
#!/bin/bash
# Copy crash reports so that they appear in device logs in Organizer in Xcode
if [ ! -e ~/Downloads/crash ]; then
echo "Download a crash report and save it as $HOME/Downloads/crash before running this script."
exit 1
fi
cd ~/Library/Logs/CrashReporter/MobileDevice/
mkdir -p actx # add crash report to xcode abbreviated
cd actx
datestr=`date "+%Y-%m-%d-%H%M%S"`
mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"
QuincyKit/PLCRを使用する場合は、2つのことを実行することで、Xcode Organizer内でドラッグアンドドロップできる場所に物事を自動化できます。
まず、リモートスクリプトのadmin/actionapi.php〜202行目を編集する必要があります。タイムスタンプが正しく表示されないため、ファイルには「crash」という名前が付けられ、Xcodeでは認識されませんドットクラッシュ):
header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
次に、QuincyKit BWCrashReportTextFormatter.m〜176行のiOS側で、@"[TODO]"
を@"TODO"
に変更して、悪い文字を回避します。
私は、提案された代替案のほとんどが最新のXCode(Xcode 10でテスト済み)ではうまくいかないことを見つけました。たとえば、Xcode - > Organizer - > Device logs -viewで、.crashログをドラッグアンドドロップできませんでした。
Symbolicatorツール https://github.com/agentsim/Symbolicator を使用することをお勧めします。