Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
iPhoneのデバッグハック<br />株式会社アイビス<br />代表取締役社長 神谷 栄治<br />
背景<br />某アプリケーションで開発環境で再現できないアプリケーションがクラッシュする不具合が発生<br />当初コンソールログにNSLog()でデバッグ情報を出力するβ版をAdHoc配布で一部のユーザに配り、コンソールログとクラッシュログ...
背景(2)<br />リリースビルドでもクラッシュログ(スタックトレースやログ)が、簡単に送ってもらえればデバッグ効率が劇的に改善<br />簡単に->クラッシュログは、Apple製のメールアプリで送ってもらう<br />うまく具合にスタックト...
APIを調査<br />NSGetUncaughtExceptionHandler()<br />NSSetUncaughtExceptionHandler()<br />signal()でSIGABRT, SIGBUS, SIGSEGV<br...
backtrace()の使い方<br />//スタックトレースの出力<br />[mstrappendString:@&quot;Stack:
&quot;];<br />	void* callstack[128];<br />inti, fr...
フロー<br />NSGetUncaughtExceptionHandler()で現在のExceptionハンドラを記憶(退避)<br />NSSetUncaughtExceptionHandler()で自分のハンドラ関数を登録<br />si...
出力例<br />	Signal:10 Stack: 0 ibisMail 0x0006989d dump + 64 1 ibisMail 0x00069b4b signalHandler + 46 2 libSystem.B.dylib 0x...
モジュールファイル名と行番号へ変換<br />ビルド時に生成されたdSYMファイルは大切に取っておく<br />gdb info lineコマンドをdSYMディレクトリで実行<br />cd $PROJ_PATH$/ build/ Releas...
まとめ<br />リリースビルドでもスタックトレースが得られる<br />スタックトレース、OSバージョン、アプリバージョン、一般ログ、メモリ不足警告発生時刻、クラッシュ時刻をApple製メールで送信<br />スタックトレースのアドレスから、...
Upcoming SlideShare
Loading in …5
×

iPhoneのデバッグハック

7,545 views

Published on

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

Published in: Technology, Business
  • Be the first to comment

iPhoneのデバッグハック

  1. 1. iPhoneのデバッグハック<br />株式会社アイビス<br />代表取締役社長 神谷 栄治<br />
  2. 2. 背景<br />某アプリケーションで開発環境で再現できないアプリケーションがクラッシュする不具合が発生<br />当初コンソールログにNSLog()でデバッグ情報を出力するβ版をAdHoc配布で一部のユーザに配り、コンソールログとクラッシュログを送ってもらうが、クラッシュログ、コンソールログの取得には統合開発環境のXcodeのオーガナイザー機能が必要であり、あまり多くの人に協力してもらえない<br />
  3. 3. 背景(2)<br />リリースビルドでもクラッシュログ(スタックトレースやログ)が、簡単に送ってもらえればデバッグ効率が劇的に改善<br />簡単に->クラッシュログは、Apple製のメールアプリで送ってもらう<br />うまく具合にスタックトレースが<br />取得できたので報告します<br />
  4. 4. APIを調査<br />NSGetUncaughtExceptionHandler()<br />NSSetUncaughtExceptionHandler()<br />signal()でSIGABRT, SIGBUS, SIGSEGV<br />backtrace()<br />backtrace_symbols()<br />
  5. 5. backtrace()の使い方<br />//スタックトレースの出力<br />[mstrappendString:@&quot;Stack: &quot;];<br /> void* callstack[128];<br />inti, frames = backtrace(callstack, 128);<br /> char** strs = backtrace_symbols(callstack, frames);<br /> for (i = 0; i &lt; frames; ++i) {<br /> [mstrappendFormat:@&quot;%s &quot;,strs[i]];<br /> }<br />
  6. 6. フロー<br />NSGetUncaughtExceptionHandler()で現在のExceptionハンドラを記憶(退避)<br />NSSetUncaughtExceptionHandler()で自分のハンドラ関数を登録<br />signal()でSIGABRT, SIGBUS, SIGSEGVのハンドラ関数を登録<br />ハンドラ関数でbacktrace()とbacktrace_symbols()スタックトレースを文字列化<br />その他のログ、OSバージョン番号、アプリバージョン番号を追加し、dump.txtとして保存<br />終了<br />異常終了がないときは、ハンドラ関数を退避しておいたものに戻して終了<br />次回起動時にdump.txtがあれば、mailto:機能でApple製メールアプリを起動<br />
  7. 7. 出力例<br /> 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 <br />_sigtramp関数の下で自分のアプリ名がでてくる最初のスタックフレームを探し、アドレスをメモする<br />
  8. 8. モジュールファイル名と行番号へ変換<br />ビルド時に生成されたdSYMファイルは大切に取っておく<br />gdb info lineコマンドをdSYMディレクトリで実行<br />cd $PROJ_PATH$/ build/ Release-iphoneos/ ibisMail.app.dSYM/<br />cd Contents/ Resources/ DWARF <br />gdb ibisMail <br />gdb&gt; info line *0x000252b9<br />Line 333 of “~/IbisMail/Classes/Models/PopClient.m&quot; <br />starts at address 0x2a386 &lt;-[PopClient retrieve:]+86&gt; and <br />ends at 0x2a390 &lt;-[PopClient retrieve:]+96&gt;.<br />行番号とモジュールファイル名が分かる<br />
  9. 9. まとめ<br />リリースビルドでもスタックトレースが得られる<br />スタックトレース、OSバージョン、アプリバージョン、一般ログ、メモリ不足警告発生時刻、クラッシュ時刻をApple製メールで送信<br />スタックトレースのアドレスから、モジュール名と行番号が分かる<br />ビルド時のdSYMファイルは大切に!<br />

×