Ad

はじめに anchor.png Edit

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で開発したアプリを対象としています。

Page Top

symbolicatecrashを使うための準備 anchor.png Edit

Page Top

symbolicatecrashの場所を確認する anchor.png Edit

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 Edit

このまま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 Edit

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

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

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

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

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

Page Top

appファイルを取得する anchor.png Edit

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

Page Top

symbolicatecrashを実行する anchor.png Edit

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

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

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

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

とします

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

Page Top

レポートの解析 anchor.png Edit

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


Front page   Edit Freeze Diff Backup Upload Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 371, today: 2, yesterday: 0
Princeps date: 2018-05-26 (Sat) 13:46:46
Last-modified: 2018-05-26 (Sat) 16:10:03 (JST) (335d) by njf
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失


NJF