ページへ戻る

− Links

 印刷 

iOS​/Crash Reportsを解析する :: NJF Wiki

xpwiki:iOS/Crash Reportsを解析する

ページ内コンテンツ
  • はじめに
  • symbolicatecrashを使うための準備
    • symbolicatecrashの場所を確認する
    • DEVELOPER_DIRを設定する
    • dSYMファイルを取得する
    • appファイルを取得する
  • symbolicatecrashを実行する
  • レポートの解析

はじめに anchor.png[1] Edit [2]

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[3]

しかし、上のページにはありませんが、「symbolicatecrash」というxcode付属のコマンドを使うとクラッシュレポートが見やすくなります(その使い方も書いておけよと全力で思いますが)。

ここでは、その「symbolicatecrash」の使い方を簡単に説明します。

ただし、このページの記述はbitcodeには対応していません。 また、xcodeで開発したアプリを対象としています。

Page Top

symbolicatecrashを使うための準備 anchor.png[4] Edit [5]

Page Top

symbolicatecrashの場所を確認する anchor.png[6] Edit [7]

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」と入力するだけで、コマンドが実行されます。

Page Top

DEVELOPER_DIRを設定する anchor.png[8] Edit [9]

このままsymbolicatecrashを実行しても

Error: "DEVELOPER_DIR" is not defined

というエラーが出て正常に実行されません。 環境変数に「DEVELOPER_DIR」を入れる必要があります。 そのために以下のコマンドを実行します。

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

もしxcodeのインストールの場所がわからず、xcodeのコマンドラインツールをインストールしている場合は、

xcode-select -p

を実行するとDEVELOPER_DIRが表示されます。

Page Top

dSYMファイルを取得する anchor.png[10] Edit [11]

注意:以下の記述はxcodeからアップロードしたアプリの場合です。 そうでない場合は各アプリ制作ツールなどでdSYMファイルなどの場所は異なります。

xcodeを立ち上げ、上のメニューバーから「Window->Organizer」と選択します。

ウインドウ上部のボタンを「Archives」を選択し(おそらく起動時にすでに選択されています)、クラッシュしたアプリのクラッシュしたビルドを右クリック(shift+クリック)します。 そして、「Show in Finder」を選択します。

表示されたアーカイブファイルをさらに右クリック(shift+クリック)し、「パッケージの内容を表示」を選択します。

すると「dSYMs」の中に「アプリ名.app.dSYM」というファイルがあるので、これを作業用のディレクトリにコピーするか、パスを取得しておきます。この場所はxcodeのバージョンによって変わる可能性があります。

Page Top

appファイルを取得する anchor.png[12] Edit [13]

先ほど表示させたアーカイブファイルの中には「Product/Application」以下にappファイルもあります。こちらも作業用のディレクトリにコピーするか、、パスを取得しておきます。

Page Top

symbolicatecrashを実行する anchor.png[14] Edit [15]

CRASH変数にsymbolicatecrashを代入しているなら、

$CRASH 「クラッシュレポートファイル」 「dSYMファイル」 「appファイル」

を実行するとクラッシュレポートが出力されます。ファイルに保存するなら、

$CRASH 「クラッシュレポートファイル」 「dSYMファイル」 「appファイル」 > 「出力ファイル」

とします

上では「dSYMファイル」「appファイル」と書いていますが、finder上でファイルに見えるだけで、実際はディレクトリです。

Page Top

レポートの解析 anchor.png[16] Edit [17]

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という関数でアプリが落ちています。


Last-modified: 2018-05-26 (土) 16:10:03 (JST) (2156d) by njf