I love Objective-C

I love Objective-C

Objective-Cをこよなく愛するとあるプログラマーの日記です。(This is a diary writen by a man who love Objective-C)

Amebaでブログを始めよう!
クラッシュログをメールで送ってもらったりすると、標準のやり方ではうまくシンボル化できないことがあります。その場合でもatosとリリース時のarchiveファイルがあればatosコマンドを使ってシンボル化する事が可能です。

以下はviewDidLoadに落ちるコードを仕込んだアプリ(ManualSimbolizasion)のクラッシュログです。

落ちている箇所

画像の真ん中にある「13 ManualSimbolizasion 0x000b3f66 0xad000 + 28542」の部分が落ちた箇所です。まずはこれをシンボル化しましょう。

シンボル化に必要なものは下記の3つです。

・シンボル化するアドレス
・アプリケーションのアーカイブ
・ロードアドレス

アーカイブは全てが必要なわけでなく下記の中身だけが必要です。

アーカイブファイルを右クリック>パッケージの内容を表示>dSYMをさらにパッケージの内容を表示>DWARFフォルダの中にある[アプリケーション名]のファイル。



ロードアドレスはクラッシュログのスタックトレースの後にあります。

ロードアドレス

画像の中央「0xad000 - 0xb4fff ManualSimbolizasion armv7」という部分の「0xad000」がロードアドレスです。ここにある「armv7」もatosのパラメータに使います。

DWARFから取り出したアプリケーション名のファイルがある場所で下記コマンドを実行するとシンボル化できます。

xcrun atos -o ManualSimbolizasion -l 0xad000 -arch armv7 0xb3f66
結果>main (in ManualSimbolizasion) (main.m:14)

結果、mainで落ちているという事がわかりました。viewDidLoadで例外を発生させたのに、main()で落ちているとはどういう事でしょうか。

それは例外で落ちた場合、最終的にmain()で落ちる事になるからです(最後に例外をキャッチするポイントがmain()なので、ここを抜けたときに例外がハンドルされなかったというエラーで落ちます)。でも安心してください。どこで例外が発生したのかもクラッシュログには出ています。

例外のバックトレース

画面中央下の「Last Exception Backtrace」を見てください。シンボル化されていないのでわかりづらいですが、これが例外発生時のスタックトレースです。

この中で特に注目するべきアドレスは2つしかありません。「0xb3f66」と「0xb3e88」です。他のアドレスは明らかに大きい値になっていて、別のモジュールです。最初のアドレスは先ほどシンボル化したmain()です。どうやら「0xb3e88」が本命のようです。シンボル化しましょう。

xcrun atos -o ManualSimbolizasion -l 0xad000 -arch armv7 0xb3e88
結果>-[ViewController viewDidLoad] (in ManualSimbolizasion) (ViewController.m:26)

ということでviewDidLoadで例外が発生している事が分かりました。

復元できるクラッシュログを入手できればそれが一番ですが、駄目なときはこの方法を使ってシンボル化してみてください。

Simbolicate crash log with the atos command. English version is comming soon.