Click here to load reader
Upload
eiji-kamiya
View
6.725
Download
1
Embed Size (px)
DESCRIPTION
リリースビルドでもスタックトレースを得る方法
Citation preview
株式会社アイビス
代表取締役社長 神谷 栄治
某アプリケーションで開発環境で再現できないアプリケーションがクラッシュする不具合が発生
当初コンソールログにNSLog()でデバッグ情報を出力するβ版をAdHoc配布で一部のユーザに配り、コンソールログとクラッシュログを送ってもらうが、クラッシュログ、コンソールログの取得には統合開発環境のXcode
のオーガナイザー機能が必要であり、あまり多くの人に協力してもらえない
リリースビルドでもクラッシュログ(スタックトレースやログ)が、簡単に送ってもらえればデバッグ効率が劇的に改善
簡単に→クラッシュログは、Apple製のメールアプリで送ってもらう
うまく具合にスタックトレースが
取得できたので報告します
NSGetUncaughtExceptionHandler()
NSSetUncaughtExceptionHandler()
signal()でSIGABRT, SIGBUS, SIGSEGV
backtrace()
backtrace_symbols()
//スタックトレースの出力
[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]];
}
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製メールアプリを起動
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関数の下で自分のアプリ名がでてくる最初のスタックフレームを探し、アドレスをメモする
ビルド時に生成された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>.
行番号とモジュールファイル名が分かる
リリースビルドでもスタックトレースが得られる
スタックトレース、OSバージョン、アプリバージョン、一般ログ、メモリ不足警告発生時刻、クラッシュ時刻をApple製メールで送信
スタックトレースのアドレスから、モジュール名と行番号が分かる
ビルド時のdSYMファイルは大切に!