9

Click here to load reader

iPhoneのデバッグハック

Embed Size (px)

DESCRIPTION

リリースビルドでもスタックトレースを得る方法

Citation preview

Page 1: iPhoneのデバッグハック

株式会社アイビス

代表取締役社長 神谷 栄治

Page 2: iPhoneのデバッグハック

某アプリケーションで開発環境で再現できないアプリケーションがクラッシュする不具合が発生

当初コンソールログにNSLog()でデバッグ情報を出力するβ版をAdHoc配布で一部のユーザに配り、コンソールログとクラッシュログを送ってもらうが、クラッシュログ、コンソールログの取得には統合開発環境のXcode

のオーガナイザー機能が必要であり、あまり多くの人に協力してもらえない

Page 3: iPhoneのデバッグハック

リリースビルドでもクラッシュログ(スタックトレースやログ)が、簡単に送ってもらえればデバッグ効率が劇的に改善

簡単に→クラッシュログは、Apple製のメールアプリで送ってもらう

うまく具合にスタックトレースが

取得できたので報告します

Page 4: iPhoneのデバッグハック

NSGetUncaughtExceptionHandler()

NSSetUncaughtExceptionHandler()

signal()でSIGABRT, SIGBUS, SIGSEGV

backtrace()

backtrace_symbols()

Page 5: iPhoneのデバッグハック

//スタックトレースの出力

[mstr appendString:@"Stack:\n"];

void* callstack[128];

int i, frames = backtrace(callstack, 128);

char** strs =

backtrace_symbols(callstack, frames);

for (i = 0; i < frames; ++i) {

[mstr appendFormat:@"%s\n",strs[i]];

}

Page 6: iPhoneのデバッグハック

1. NSGetUncaughtExceptionHandler()で現在のExceptionハンドラを記憶(退避)

2. NSSetUncaughtExceptionHandler()で自分のハンドラ関数を登録

3. signal()でSIGABRT, SIGBUS, SIGSEGVのハンドラ関数を登録

4. ハンドラ関数でbacktrace()とbacktrace_symbols()スタックトレースを文字列化

1. その他のログ、OSバージョン番号、アプリバージョン番号を追加し、dump.txtとして保存

2. 終了

5. 異常終了がないときは、ハンドラ関数を退避しておいたものに戻して終了

6. 次回起動時にdump.txtがあれば、mailto:機能でApple製メールアプリを起動

Page 7: iPhoneのデバッグハック

Signal:10 Stack: 0 ibisMail 0x0006989d dump + 64 1 ibisMail 0x00069b4b signalHandler + 46 2 libSystem.B.dylib 0x31dcd60b _sigtramp + 26 3 ibisMail 0x000252b9 -[PopClientcreateUnreadMessageWithUIDL:maxMessageCount:] + 76 4 ibisMail 0x00025b85 -[PopClient getUnreadIdList:] + 348 5 ibisMail 0x000454dd -[Connection receiveMessages:] + 688 6 ibisMail 0x00042db1 -[Connection main] + 188 7 Foundation 0x305023f9 __NSThread__main__ + 858 8 libSystem.B.dylib 0x31d6a5a8 _pthread_body + 28 AppVer:ibisMail 1.2.0 System:iPhone OS OS Ver:3.0 Model:iPhoneDate:09/06/08 21:25:59JST

_sigtramp関数の下で自分のアプリ名がでてくる最初のスタックフレームを探し、アドレスをメモする

Page 8: iPhoneのデバッグハック

ビルド時に生成されたdSYMファイルは大切に取っておく

gdb info lineコマンドをdSYMディレクトリで実行cd $PROJ_PATH$/ build/ Release-iphoneos/ ibisMail.app.dSYM/

cd Contents/ Resources/ DWARF

gdb ibisMail

gdb> info line *0x000252b9

Line 333 of “~/IbisMail/Classes/Models/PopClient.m"

starts at address 0x2a386 <-[PopClient retrieve:]+86> and

ends at 0x2a390 <-[PopClient retrieve:]+96>.

行番号とモジュールファイル名が分かる

Page 9: iPhoneのデバッグハック

リリースビルドでもスタックトレースが得られる

スタックトレース、OSバージョン、アプリバージョン、一般ログ、メモリ不足警告発生時刻、クラッシュ時刻をApple製メールで送信

スタックトレースのアドレスから、モジュール名と行番号が分かる

ビルド時のdSYMファイルは大切に!