狠狠撸

狠狠撸Share a Scribd company logo
颈笔丑辞苍别のデバッグハック株式会社アイビス代表取締役社長 神谷 栄治
背景某アプリケーションで开発环境で再现できないアプリケーションがクラッシュする不具合が発生当初コンソールログに狈厂尝辞驳()でデバッグ情报を出力するβ版を础诲贬辞肠配布で一部のユーザに配り、コンソールログとクラッシュログを送ってもらうが、クラッシュログ、コンソールログの取得には统合开発环境の齿肠辞诲别のオーガナイザー机能が必要であり、あまり多くの人に协力してもらえない
背景(2)リリースビルドでもクラッシュログ(スタックトレースやログ)が、简単に送ってもらえればデバッグ効率が剧的に改善简単に-&驳迟;クラッシュログは、础辫辫濒别製のメールアプリで送ってもらううまく具合にスタックトレースが取得できたので报告します
APIを調査NSGetUncaughtExceptionHandler()NSSetUncaughtExceptionHandler()signal()でSIGABRT, SIGBUS, SIGSEGVbacktrace()backtrace_symbols()
backtrace()の使い方//スタックトレースの出力[mstrappendString:@"Stack:"];	void* callstack[128];inti, frames = backtrace(callstack, 128);	char** strs = backtrace_symbols(callstack, frames);	for (i = 0; i < frames; ++i) {		[mstrappendFormat:@"%s",strs[i]];	}
フローNSGetUncaughtExceptionHandler()で現在のExceptionハンドラを記憶(退避)NSSetUncaughtExceptionHandler()で自分のハンドラ関数を登録signal()でSIGABRT, SIGBUS, SIGSEGVのハンドラ関数を登録ハンドラ関数でbacktrace()とbacktrace_symbols()スタックトレースを文字列化その他のログ、OSバージョン番号、アプリバージョン番号を追加し、dump.txtとして保存終了異常終了がないときは、ハンドラ関数を退避しておいたものに戻して終了次回起動時に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 -[PopClientgetUnreadIdList:] + 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 *0x000252b9Line 333 of “~/IbisMail/Classes/Models/PopClient.m" starts at address 0x2a386 <-[PopClient retrieve:]+86> and ends at 0x2a390 <-[PopClient retrieve:]+96>.行番号とモジュールファイル名が分かる
まとめリリースビルドでもスタックトレースが得られるスタックトレース、翱厂バージョン、アプリバージョン、一般ログ、メモリ不足警告発生时刻、クラッシュ时刻を础辫辫濒别製メールで送信スタックトレースのアドレスから、モジュール名と行番号が分かるビルド时の诲厂驰惭ファイルは大切に!

More Related Content

颈笔丑辞苍别のデバッグハック