Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

10.1 開発ツール

ginrou edited this page May 21, 2013 · 11 revisions

この章では、開発を進めて行く上で手助けとなる、Xcode付属の開発ツールについて紹介します。

具体的には、

  • デバッガ
  • パフォーマンス解析ツールであるInstruments
  • 静的解析ツール

について紹介します。

解説には、次のプロジェクトを利用します。下記URLよりダウンロードしてXcodeで開いてください。

デバッガ

XcodeにはiOSやOSX向けのコンパイラとしてCLangとLLVMが搭載されており、LLVMのデバッガであるLLDBをXcode上で使うことができます。 この節では、このLLDBを用いたデバッグの手法について紹介します。

ブレークポイントの設定と管理

ブレークポイントを追加/削除

  • ソースコードの行番号をクリック (行数がでない時は 環境設定→Text Editing → Line Numbersにチェックを入れる)
  • 追加したい行にカーソルを置いて⌘+\

のいずれかを行います。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_1.png

ブレークポイントの管理

デバッガの一覧はNavigatorのBreakPoint navigatorで確認できます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_2.png

デバッガの実行

では、35行目

NSString *str = [self stringFromInteger:i];

にブレークポイントを設定した状態で実行してみましょう。次のような画面で止まると思います。 この画面について解説します。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_3.png

  • Thread list (左側、縦長) スレッドごとのスタックフレームを見ることができます。黒文字の箇所はプロジェクト内でビルドされたもので、クリックすることでスタックにジャンプできます
  • DebugArea (下部)
    • 変数エリア 停止した段階での変数の値を確認することができます。自動変数、ローカル変数、レジスタを含んだグローバル変数の3種類の変数を閲覧できます。
    • コンソールエリア 普段は標準出力が表示されますが、デバッガのコンソールとしても使うことができます。LLDBのコマンドが使えます

詳しくはこちらをご覧下さい

http://developer.apple.com/library/ios/#recipes/xcode_help-debug_navigator/articles/about_debug_navigator.html

ステップイン、ステップオーバーと変数のダンプ

ステップインは、停止中の行が関数だった場合にその関数の中に入りデバッグを続けます。ステップオーバーは関数を無視して次の行に進みます。ともに一行ずつ進めながらデバッグを行う方法です。

Xcodeでは以下のように実行できます。

  • ステップイン : F7
  • ステップオーバー : F6

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_4.png

一行ずつデバッグを進めているとき、変数の中身は変数エリアで確認することができます。

  • NSStringやNSArray, NSDictionaryなどの変数の中身を確認することができます
    • descriptionというメソッドを実装していた場合その中身を確認することができます
    • このメソッドはどのクラスでもオーバーライドすることができます。デバッグが煩雑になってきたら書いてみましょう
  • コンソールで'po 変数名'とコマンドを入力することで、変数の値をコンソールに出力することができます。 po val

また、メソッドのreturn valueも確認することができます。デバッガのステップアウトを行うと、次のように表示されます。 ステップアウトとは、ステップインした関数から抜けることです。F8で実行できます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_5.png

デバッガコマンド

デバッガのコマンドはコンソールより実行することができます。

詳しいコマンドは下記に譲り、ここでは簡単にいくつかのコマンドを紹介します。

http://lldb.llvm.org/lldb-gdb.html

コマンド 説明
s, step ステップイン
n, next ステップオーバー
f, finish ステップアウト
h ヘルプを表示
br ブレークポイントを追加(要引数)
p foo ローカル変数 p を表示
po (式) 式を評価
po foo [foo description] を表示
bt スレッドのバックトレースを表示

ブレークポイントにアクションを仕込む

ブレークポイントには、アクションを仕込むことが出来ます。 例えば、ある回数以上ヒットした時にストップする、変数の値を表示し続ける、などが可能です。

ブレークポイントで右クリックをするとEdit Breakpoint が表示されるので、そこから編集可能です。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_6.png

  • condition には条件を入れます。その場で参照できる変数などを利用できます。
  • Add Actionでアクションを追加します。
    • デバッガのコマンドやLogを指定して出力、AppleScriptなどが利用できます
  • Automatically continue after evaluating にチェックを入れると自動的に続行します。

以下は、iが5より大きい時に、停止せずにstrの中身をコンソールに出力するときのブレークポイントです

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/debugger_7.png

Instruments

Instrumentsとは、Xcodeに付属するパフォーマンス解析ツールです。プロセスを追跡したり、アプリケーションの挙動に関するデータを集めることができる、非常に強力なツールです。Instrumentsを使うことで、アプリケーションに関して例えば次の項目を確認することができます。

  • メモリの使用量
  • リーク、オーバーリリースなインスタンス
  • メソッドごとに要した処理時間
  • システムコールの回数やタイミング
  • ディスクI/Oの回数や処理時間
  • 自動テスト
  • グラフィックス(OpenGL)のパフォーマンス

この章では Instruments の中でもよく使う、Time Profilerと Memory Usage & Leaks について紹介します

なお、Instrumentsについての詳細なリファレンスについては、以下をご覧ください

https://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html

https://developer.apple.com/library/ios/#documentation/AnalysisTools/Reference/Instruments_User_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011355

Memory Usage & Leaks

それではInstrumentsを使って行きましょう。先ほどと同じプロジェクトを使います。view controller は主にMixiInstrumentsViewControllerを用います。

Instrumentsの起動は、⌘+I、もしくはXcode左上の Runボタンを長押しするとProfileが出てくるので、そこから実行できます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_1.png

起動すると次のような画面があらわれます。この画面ではInstrumentsの機能のうち、どの項目を調査するのかを選ぶテンプレートとなっています。 今回はメモリリークについて調べるのでLeaksを選びます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_2.png

選ぶとアプリケーションが実行され、次の画面が現れます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_3.png

  • 左側のバーは instruments pane と呼ばれトラックしているinstrumentsのタイプが表示されます
  • instruments pane の右は track pane と呼ばれ、時刻ごとに各instrumentsがどのような値を取ったかを表示します
  • 下部は detail pane と呼ばれ各instrumentsの詳細な情報を見ることができます。

メモリリークを見るにはinstruments pane の中からLeaksを選択します。

この状態で二つ目のタブを選択し、テーブルビューのセルをいくつかタップしてください。 しばらくすると、次のようなに変化すると思います。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_4.png

このとき detail pane に表れているのがリークしているオブジェクトです。Responsible Frameにめぼしいメソッドなどが表示されます。 右側にExtended Detailを表示するとそれぞれのメソッドがスタックフレームのように出力されます。 その中で、メソッドをダブルクリックするとリークの原因となっている箇所が表示されます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_5.png

また、Detail Pane 上部から Cycle & Roots を選択すると参照関係をグラフィカルに確認することができます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_6.png

これらの機能を用いて、メモリリークの原因を特定します。

Time Profiler

Instrumentsにある機能紹介、二つ目は Time Profilerです。Time Profiler では一定間隔ごとにCPU上で走っているプロセスのスタックトレースを取得します。それぞれのメソッドに対して、どれくらいの時間がかかったかを確認することができます。

サンプルプロジェクトの時間のかかり具合を見るために、一度iOS5のシミュレータにセットしてください。 Instrumentsを起動して、テンプレートから Time Profiler を起動します。起動したら、二つ目の画面で何度か上下にスクロールしてみてください。

次のような画面を見ることができると思います。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_7.png

Detail Pane には、どのスレッドでどれくらいの時間がかかったかが表示されています。 このままの表示だと見づらいので、左側の、 Hide Missing Symbols, Hide System Libraries, Show Obj-C Only にチェックを入れます。すると、参照することのできるメソッドが表示されます。

その中で時間を取っているメソッドをダブルクリックすると、どのメソッドのどの箇所でどれくらい時間を取っているかを見ることができます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/inst_8.png

この場合だと、

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [NSLocale systemLocale];

あたりで時間を取っているのが分かるかと思います。ちなみに、iOS6では改善されていました。

Static Analyzer

Static Analyzer は Xcodeに付属している静的解析ツールです。Syntaxなどのチェックより、コードによるメモリリークなどを警告してくれます。 使い方は ⌘ + shift + B です。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/10.1/analyzer_1.png

上記例では、初期化の行われていないポインタの比較が行われているという警告です。

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally