はじめに
App Storeに申請して審査でリジェクトされたとき、もし原因がアプリのクラッシュなら、クラッシュレポートが送られてくるときがあります。 しかし、中を見ても、
Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0: 0 libsystem_kernel.dylib 0x000000018167fe5c 0x18167f000 + 3676 1 libdispatch.dylib 0x000000018150f0b0 0x18150b000 + 16560 2 libdispatch.dylib 0x000000018150f924 0x18150b000 + 18724
というような感じで、そのままでは意味が分かりません。
いっしょに「このページ参照してください」という感じで、クラッシュレポートの見方についての以下のURLが送られてくるのですが、今ひとつ使い勝手が良くありません。
https://developer.apple.com/library/content/technotes/tn2151/_index.html
しかし、上のページにはありませんが、「symbolicatecrash」というxcode付属のコマンドを使うとクラッシュレポートが見やすくなります(その使い方も書いておけよと全力で思いますが)。
ここでは、その「symbolicatecrash」の使い方を簡単に説明します。
ただし、このページの記述はbitcodeには対応していません。 また、xcodeで開発したアプリを対象としています。
symbolicatecrashの場所を確認する
symbolicatecrashの入っているディレクトリはxcodeのバージョンによって変わります。 しかし、「/Applications/Xcode.app/Contents/」以下のどこかにあるのは間違いなさそうなので、findで検索して場所を確認します。
find /Applications/Xcode.app/Contents/ -name "symbolicatecrash"
ver.9.3.1では以下の四カ所にあります。
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
多分全て同じ物でどれを使ってもかまわないと思いますが、最初の3つはシミュレーター付属のようなので4つめのものを使います。
このままいちいち長いコマンドを使うのも面倒なので、作業するコンソールで変数に入れておきます。 このディレクトリにパスを通すのでもかまいません。 ただ、前述のようにxcodeのバージョンによって場所が変わるので、ログインシェルの環境変数などに固定でパスを入れてもあまりありがたみはありません。
CRASH="/Applications/Xcode.app/Contents//SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash"
これで「$CRASH」と入力するだけで、コマンドが実行されます。
DEVELOPER_DIRを設定する
このままsymbolicatecrashを実行しても
Error: "DEVELOPER_DIR" is not defined
というエラーが出て正常に実行されません。 環境変数に「DEVELOPER_DIR」を入れる必要があります。 そのために以下のコマンドを実行します。
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
もしxcodeのインストールの場所がわからず、xcodeのコマンドラインツールをインストールしている場合は、
xcode-select -p
を実行するとDEVELOPER_DIRが表示されます。
dSYMファイルを取得する
注意:以下の記述はxcodeからアップロードしたアプリの場合です。 そうでない場合は各アプリ制作ツールなどでdSYMファイルなどの場所は異なります。
xcodeを立ち上げ、上のメニューバーから「Window->Organizer」と選択します。
ウインドウ上部のボタンを「Archives」を選択し(おそらく起動時にすでに選択されています)、クラッシュしたアプリのクラッシュしたビルドを右クリック(shift+クリック)します。 そして、「Show in Finder」を選択します。
表示されたアーカイブファイルをさらに右クリック(shift+クリック)し、「パッケージの内容を表示」を選択します。
すると「dSYMs」の中に「アプリ名.app.dSYM」というファイルがあるので、これを作業用のディレクトリにコピーするか、パスを取得しておきます。この場所はxcodeのバージョンによって変わる可能性があります。
appファイルを取得する
先ほど表示させたアーカイブファイルの中には「Product/Application」以下にappファイルもあります。こちらも作業用のディレクトリにコピーするか、、パスを取得しておきます。
symbolicatecrashを実行する
CRASH変数にsymbolicatecrashを代入しているなら、
$CRASH 「クラッシュレポートファイル」 「dSYMファイル」 「appファイル」
を実行するとクラッシュレポートが出力されます。ファイルに保存するなら、
$CRASH 「クラッシュレポートファイル」 「dSYMファイル」 「appファイル」 > 「出力ファイル」
とします
上では「dSYMファイル」「appファイル」と書いていますが、finder上でファイルに見えるだけで、実際はディレクトリです。
レポートの解析
symbolicatecrashを実行すると、以下のようにそれまで数値だったレポートの4列目にシンボル名が入ります。
Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0: 0 libsystem_kernel.dylib 0x000000018167fe5c semaphore_timedwait_trap + 8 1 libdispatch.dylib 0x000000018150f0b0 _dispatch_sema4_timedwait$VARIANT$mp + 60 2 libdispatch.dylib 0x000000018150f924 _dispatch_semaphore_wait_slow + 72
クラッシュしたスレッドの横には「Crashed」と言う文字列が入っています。 そのスレッドの一番上がクラッシュしたとき最後に実行されていた関数やメソッドになります。
Thread 34 Crashed: 0 MyApp 0x0000000100a95ac4 curl_easy_cleanup + 24 1 MyApp 0x000000010081bfec cocos2d::extension::CURLRaii::~CURLRaii() + 180204 (HttpClient.cpp:288) 2 MyApp 0x000000010081b644 cocos2d::extension::networkThread(void*) + 177732 (HttpClient.cpp:192)
上の例だとcurl_easy_cleanupという関数でアプリが落ちています。
Page Info | |
---|---|
Page Name : | iOS/Crash Reportsを解析する |
Page aliases : | None |
Page owner : | njf |
Can Read | |
Groups : | All visitors |
Users : | All visitors |
Can Edit | |
Groups : | All visitors |
Users : | All visitors |