修正日: 07/10/19
練習問題12
CalcBMIみたいなのを作ってみよう! その8 前編
今回はプログラミングをする上で必須のツール、デバッガの使い方を簡単に説明します。デバッガはプログラムのバグを見つけるためのプログラムで、ソースコードを一行ずつ実行したり、特定の箇所で止めたり、変数の状態を調べたりすることができます。

まずデバッガを起動するにはプログラムをデバッグできる状態でビルドする必要があります。Xcodeでプロジェクトを開いたら「プロジェクト」メニューの「アクティブなビルド構成を設定」で「Debug」を選択してください。これでビルドの際、デバッガで利用できる形でアプリケーションがビルドされます。逆に一般に配布するためのアプリケーションを作る場合は「Release」を選択してビルドしてください。選択したらツールバーのボタンから「ビルドとデバッグ」をクリックします。これで自動的にアプリケーションがビルドされデバッグが始まります。
デバッグが始まるとデバッガウィンドウが開きます。このウィンドウで様々デバッグ作業を行います。そのままではおそらく何も起こりませんので、「ブレークポイント」をセットしてプログラムの動作を止めてみます。メソッド「awakeFromNib」の中で「loadUserDefaults」を呼び出しているところに移動し、左側の行番号が表示されているところをクリックしてください。紺色のマークが表示されるはずです。

これがブレークポイントです。ブレークポイントを設定しておくと、デバッグの際プログラムがそこまで実行されたら自動的にプログラムの実行が止まります。「ビルドとデバッグ」をクリックして実行してみましょう。

上のスクリーンショットのように途中で実行が止まるはずです。まずウィンドウの下部ですが、現在実行中のコードが表示されます。青く強調表示されている部分でプログラムの実行が止まっています。スクリーンショットでは「loadUserDefaults」のところが強調されていますが、「loadUserDefaults」はまだ実行されていません。実行される前の段階です。ウィンドウ右上はプログラムの中の変数の名前と値が一覧で表示されます。これについては後で説明します。左上はコールスタックといって、関数やメソッドの呼び出しの階層が表示されます。

これは下から順番に上に向かって関数やメソッドが呼び出された、ということを示しています。全てのCプログラムはmain()関数から始まる、ということを学びましたが、一番下、つまり関数呼び出しの一番最初は確かにmainになっています。main()関数はその中でNSApplicationMainという関数を呼び出し、NSApplicationMainはNSBundleオブジェクトの「loadNibNamed:owner:」というメソッドを呼び出し、それは「loadNibFile:externalNameTable:withZone:」というメソッドを呼び出し・・・と続いて最後に「awakeFromNib」が呼び出された、ということがわかります。あるメソッドがいったいどういう敬意で呼ばれたのかを調べるときなどに有用な情報です。
ウィンドウの表示を一通り眺めたらツールバーの「ステップイン」というボタンを押してください。強調表示は「loadUserDefaults」のメソッドの中に移動して止まります。

ステップインというのは今止まっている行の関数の中に入れ、という指示です。それに対して「ステップオーバー」をクリックすると「loadUserDefaults」メソッドを実行して次の行(ここでは「calcBMIAndSet」)で止まります。つまりこれから実行しようとしている処理の中に入って詳しく調べたいときはステップイン、ただ実行するだけのときはステップオーバーを選択します。では「ステップアウト」とは何かというと、現在実行中のメソッド(関数)の残りを実行して上に出ろ、ということです。例えば「loadUserDefaults」の中をステップオーバーで半分くらい調べたあとステップアウトをクリックするとawakeFromNibの「calcBMIAndSet」のところまで進みます。また「続ける」ボタンを押すと一行ごとの実行をやめて普通に処理を進めます。次のブレークポイントがあればそこまで進んで止まりますし、無ければそのままアプリケーションの実行を続けます。文章で書くとわかりにくいので、実際にボタンをいろいろ操作してどういう風に動くのか試してみてください。