iPhoneのデバッグハック

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    1 Favorite

    iPhoneのデバッグハック - Presentation Transcript

    1. iPhoneのデバッグハック
      株式会社アイビス
      代表取締役社長 神谷 栄治
    2. 背景
      某アプリケーションで開発環境で再現できないアプリケーションがクラッシュする不具合が発生
      当初コンソールログにNSLog()でデバッグ情報を出力するβ版をAdHoc配布で一部のユーザに配り、コンソールログとクラッシュログを送ってもらうが、クラッシュログ、コンソールログの取得には統合開発環境のXcodeのオーガナイザー機能が必要であり、あまり多くの人に協力してもらえない
    3. 背景(2)
      リリースビルドでもクラッシュログ(スタックトレースやログ)が、簡単に送ってもらえればデバッグ効率が劇的に改善
      簡単に->クラッシュログは、Apple製のメールアプリで送ってもらう
      うまく具合にスタックトレースが
      取得できたので報告します
    4. APIを調査
      NSGetUncaughtExceptionHandler()
      NSSetUncaughtExceptionHandler()
      signal()でSIGABRT, SIGBUS, SIGSEGV
      backtrace()
      backtrace_symbols()
    5. 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]];
      }
    6. フロー
      NSGetUncaughtExceptionHandler()で現在のExceptionハンドラを記憶(退避)
      NSSetUncaughtExceptionHandler()で自分のハンドラ関数を登録
      signal()でSIGABRT, SIGBUS, SIGSEGVのハンドラ関数を登録
      ハンドラ関数でbacktrace()とbacktrace_symbols()スタックトレースを文字列化
      その他のログ、OSバージョン番号、アプリバージョン番号を追加し、dump.txtとして保存
      終了
      異常終了がないときは、ハンドラ関数を退避しておいたものに戻して終了
      次回起動時にdump.txtがあれば、mailto:機能でApple製メールアプリを起動
    7. 出力例
      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関数の下で自分のアプリ名がでてくる最初のスタックフレームを探し、アドレスをメモする
    8. モジュールファイル名と行番号へ変換
      ビルド時に生成された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>.
      行番号とモジュールファイル名が分かる
    9. まとめ
      リリースビルドでもスタックトレースが得られる
      スタックトレース、OSバージョン、アプリバージョン、一般ログ、メモリ不足警告発生時刻、クラッシュ時刻をApple製メールで送信
      スタックトレースのアドレスから、モジュール名と行番号が分かる
      ビルド時のdSYMファイルは大切に!
    SlideShare Zeitgeist 2009

    + Eiji KamiyaEiji Kamiya Nominate

    custom

    408 views, 1 favs, 0 embeds more stats

    リリースビルドでもスタックトレース more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 408
      • 408 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 1
    • Downloads 3
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories