NetBeansサイド
FuelBeans 15 : デバッガーを使いこなす
情報を表示するだけでは、デバッグの効率は上がりません。デバッガーを使いこなしましょう。
とはいえ、デバッガーを動かすまでがやや難しいのです。(NetBeansのせいではありませんよ。)それ故、使いこなしている人も多くないのか、情報が散在しています。
PHPのデバッグには、今はxDebugが使われます。PHPの開発元ZendDebuggerというプログラムもありますが、だいぶ前に開発が止まっているようです。xDebugはPHPの一人の開発者が作成したもので、現在もメンテナンスされています。
このxDebugはOSやら32/64ビットがどうのとか、PHP自体を作成するときのコンパイルオプションがどうしたとかで、まず、正しく動くものを選ぶのが大変です。動いたら動いたで、不安定な部分を踏んでしまうと、サーバーを巻き込んで死んでしまう厄介者です。
でも、はっきりと使い方を自覚していれば大丈夫。統合環境でのデバッグは快適ですよ。
まず、今回のチュートリアルのために、簡単なサンプルプログラムを作りました。debuggerコントローラーです。作成してください。手打ちしても良し、コピペしても良しです。
<?php
class Controller_Debugger extends Controller {
static $aaa;
static $bbb = 'Hello';
static $ccc = array('neko' => 'Shiro', 'inu' => 'Kuro');
private $xxx;
public static $yyy;
private static $zzz;
/*
* テスト本体
*/
public function before() {
static $in_aaa;
static $in_bbb = '関数内';
echo 'before()へ入りました<br>';
$this->xxx = 'private変数';
self::$yyy = 'public static変数';
static::$zzz = 'private static変数';
return parent::before();
}
public function action_index() {
echo 'action_index()へ入りました<br>';
Debug::dump($this);
}
public function after($response) {
echo 'after()へ入りました<br>';
return parent::after($response);
}
}
そうしたら、普通に一回動かしてみましょう。実行アイコン(緑の右矢印)をクリックです。
たぶん、実行環境で設定するURLが異なっているので、404ページが表示されるか、FuelPHPのサンプルページが表示されていることでしょう。(これまで、どのチュートリアルを実際に行ったかで環境が皆さんの環境が異なってしまっており、それによって、動きが異なります。)
ブラウザのURLをlocalhost/fuelphp/public/debuggerとして実行してください。エラー無く動作しますよね?エラーが表示されるのなら、タイプミスが無いか確認してください。どうしても404が表示されるのなら、ルーティングを確認し、自分のベースURLがlocalhost/fuelphp/publicなのか、確認しましょう。それも、デバッグの経験です。:D
さて、スムーズに動いた方は、おめでとうございます。先へ進みます。
では、デバッガーを動かしてみましょう。いつも使用している実行アイコンは緑色の右三角ですが、その右に四角の右隅に小さな緑の、右三角がついたアイコンがあります。カーソルをのせたままにすると、プロジェクト(fuelphp)をデバッグと表示されます。これを、クリックします。
すると、何やらエディター上でindex.phpが表示され、その中の一行が緑色で表示されるはずです。そうなった方はおめでとうございます。今のところxDebuggerは上手く動作しているようです。
この緑色の行は、実行ポイントを表します。実行ポイントとは「次に、この行を実行します」という印です。
NetBeansが固まった人、ソケットがどうのこうのというダイアログが表示されたかた、アパッチなどのWebサーバーが死んでしまった方は、watch式を使用していないか、まず確認してください。
ウィンドウ→デバッグ→ウォッチを選びます。下部に表示されたウォッチウィンドウに項目がある場合、右クリック→全て削除を行い、再度チェレンジしてください。
項目が一つもない場合、もしくは全部削除してもうまく動作しない場合は、このページの一番最後の章、「最新のxDebugをインストールする」をお読みください。(なお、これ以降の手順のどこかで、このような自体が起きた場合も、最新のxDebugをインストールして見ることをお勧めします。様々な要素が絡みあい、これで大丈夫と提示できる方法がないのですが、新しいxDebugを後述の方法でインストールしていただくと、安定して使用できる可能性が大きいです。)
実行した時と同様に、index.phpが表示されることもなく、ただブラウザに結果が表示された場合、オプションが異なっているかも知れません。オプション→PHP→デバッグで、最初の行で停止にチェックが付いているか確認してください。
この、最初の行で止めるオプションは、その名のとおり、最初に実行されるPHPの実行分が存在するファイルを開き、その行で実行を中断するオプションです。
FuelPHPの場合、必ずindex.phpが実行されます。URLに書かれていない場合でも、.htaccessの働きで、必ずindex.phpが実行されます。
ですが、いつもindex.phpの最初の実行で停止するのは、いささか煩雑です。ですから、このオプションのチェックは消してしまいましょう。
消したら、今動作しているデバッガを一度停止しましょう。デバッガ動作中は、赤い四角の中に白い小さな四角のアイコンが、表示されます。これは、デバッガを停止し、デバッグ作業を終了するボタンです。これを押しましょう。
(もしかしたら、このオプションを消してしまうと、xDebugが正しく動作しなくなるかも知れません。過去のバージョンではありました。ですから、もし、このオプションを消して、動かなくなったのなら、再度指定しなおしましょう。)
では、サンプルプログラムに戻ります。
デバッガの機能で、実行を行単位で追跡することができます。デバッガに対して、「この行で停止してください」という印をブレークポイントと言います。
NetBeansを始め、大抵のIDEでは、行番号をクリックすることで、このブレークポイントを設定できます。やってみてください。ブレークポイントの解除は、再度行番号をクリックします。
では、2行目から最後の行まで、ブレークポイントを設定してください。それが終わりましたら、画面を御覧ください。
設定にもよりますが、ブレークポイントを設定した行は、行自身が赤く表示されます。そして、赤の濃さが違っている行がありませんか?濃い行と薄い行の行番号の場所に表示されている、アイコンを比べてください。
わかりづらいですが、普通の四角と真ん中で割れているような四角になっています。真ん中で割れている四角は「この行では、ブレークポイントは無効です。」と教えてくれています。コメントや空行では、PHPの命令も何もありませんから、停止できないのです。
では、無効のブレークポイントを全部、解除してください。
そうしたら、一度デバッガを実行してみましょう。デバッガを開始するアイコンをクリックです。
まず、404ページが表示されたと思います。しかし、そのURLに?XDEBUG_SESSION_START=netbeans-xdebugが付いていると思います。
これは、デバッガに対し、このリクエストをデバッグしてくださいという目印なのです。同じPHPで動かしていても、この行が付いていないリクエストはデバッグの対象になりませんでした。(過去形です)
ところが、最近のバージョンでは、この目印をクッキーで保存しているらしく、つけなくてもデバッグ対象として認識されます。逆に言えば、デバッグの対象で無いつもりでも、デバッグの対象になってしまうということです。
実際、PHPをいくつも平行して実行しながらデバッグすることはありませんでしょうから、デメリットは有りません。メリットとしては、この長いマーカーをURLに付けなくても済むということです。
ただし、クッキーが使用できない環境やブラウザのクッキーを使用しない設定の場合、付けないとデバッグされず、通常の実行となってしまいます。覚えておきましょう。
では、ブラウザのURLをlocalhost/fuelphp/public/debuggerに指定し、実行してみましょう。この場合の実行とは、URLを打ち込み終わったら、Enterキーを叩くか、再起動アイコンをクリックすることです。
NetBeansを見ると、4行目のクラスの定義で停止しています。では覚えましょう。クラスの定義では停止する、です。
実行を停止してる状態では、緑丸に小さい白右三角のアイコンが表示されます。実行を続行するアイコンです。これをクリックすると、次のブレークポイントが存在する行で停止するか、PHPの実行できるコードの最後まで実行し、そのあとはデバッガもお休みです。(緑の行、実行ポイントはどこにも表示されません。緑のアイコン、続行も表示されません。)
では、続行しましょう。続行アイコンをクリックしましょう。
すると今度は18行目、staticのin_aaaの宣言文で止まりました。ということは、クラスの変数の宣言では停止しない、そして関数の宣言文では停止しないということです。覚えておきましょう。
何度か続行アイコンをクリックし、before()関数中のreturn文まで実行ポイント(緑の行)を進めてください。
続行アイコンを押しましょう。すると、閉じ括弧は飛ばされ、31行目、action_indexのecho文で停止しました。それでは、関数の最後では、停止しないと覚えておきましょう。
では続けて、実行ポイントが表示されなくなるまで、続行アイコンをクリックしましょう。ブラウザを確認してください。実行結果が表示されています。
では、デバッガを停止しましょう。赤い四角のアイコン、デバッガセッションを終了をクリックです。
ブラウザにDEBUG SESSION ENDEDと表示されます。これは、デバッガを停止した時必ず表示されます。
ここまでで、ブレークポイントを設定できるが、実際は停止しない行があるのがわかったと思います。これを知っておかないと、デバッガが動かない、壊れたのかと頭を悩ます事になります。
一般的に、実行分では必ず止まります。もし、止まらずどうしようかと思うときは、それ以上悩まず、その前後の文にもブレークポイントを設置し、デバッガーを起動してみるのもテクニックですよ。
どこでブレークポイントが有効か、無効かを理解してもらいましたら、ブレークポイントを全部解除しましょう。一つ一つクリックする必要はありません。
ウィンドウの下部にブレークポイントと表示されたタブかウィンドウは表示されていませんか?表示されていない場合は、ウィンドウ→デバッグ→ブレークポイントで表示してください。
そこに、ブレークポイントの一覧が表示されています。それをクリックすると、指定した行に移動できます。行方不明になったブレークポイントの捜索に使えます。
では、このウィンドウで右クリックし、全て削除を選んでください。設定したブレークポイントが全部クリアされます。
さて、いつも全行にブレークポイントを付けなければ、一行、一行実行しながら、確かめられないのかといえば、そんな面倒なことはありません。ちゃんと、一行、一行実行する方法があります。
ステップ実行といいます。18行目、before()関数の最初の行にブレークポイントを設定してください。続いて、デバッガーを起動し、必要に応じブラウザでURLを書き換え、実行し、このプログラムを呼び出します。
18行目に実行ポイント、緑の行が来ましたか?では、続けましょう。
一行、一行実行することをステップ実行といいます。一歩、一歩進むからですね。二種類の方法があります。まずは、ステップオーバーを使いましょう。
緑の継続アイコンの右側、矢印が下側に向いていますが、回り込んでいるようなアイコン、カーソルを乗せると、ステップオーバーと表示されます。これをクリックです。
続けて何度が、行なってください。実行ポイントがどのように動くか注意しながら、行いましょう。returnに実行ポイントが来るまで、続けてください。
どうでしょうか?一行一行実行されている様子が、理解できましたか?
実行ポイントはreturn文の上です。return文で親のbefore()関数を実行しています。親はControllerクラスです。では、もう一度、ステップオーバーをクリックです。
request.phpの442行目へ移動しました。return文は、呼び出し元へ戻る命令です。ですから、before()を呼び出しもとの行に戻ったのです。(440行を見てみるとbeforeという文字が見つかります。複雑ですが、この行から呼び出されていたわけです。)
さて、return文では親のbefore()関数を実行していましたが、親のbefore()の中には行きませんでした。これが、ステップオーバーです。飛び越しです。その行に他の関数の呼び出しや、クラスの生成などを行なっていても、それ以上深入りしません。
逆に深入りしたいときはどうしましょう。先ほどのreturn文でしたら、親のbefore()の実行分へ行きたい時です。そんな時は、ステップインを使います。ステップオーバーの右隣、下向きの矢印のアイコンです。
試してみましょう。一回実行を停止し、再度デバッガーを起動してください。先ほどと同様に、before()の最初のブレイクポイントで実行ポイントが停止するようにします。
では、ステップインをクリックしてください。何度か、クリックしてreturn文まで実行ポイントを進めてください。
return文に車では、ステップオーバーと変わりません。それ以上、深入りできるような、関数の呼び出しや、クラスの生成がなかったからです。深入りできるものが無い限り、ステップオーバーと同じ動きをします。
では、return文でステップインをクリックしましょう。Controllerクラスが表示され、before()文へ実行ポイントが移動します。{ }ですから、何も実行していないのが、分かります。
このように、深入りしたいときはステップイン、深入りしないときはステップオーバーを利用して、一行ずつ実行していくことができます。
(もっと知りたい方へ:このチュートリアルが終わったら、一行で2つ以上の関数を呼びだすテストプログラムを作成し、ステップイン、ステップオーバーで、どのように動くか実験してください。呼び出す関数は、自前の関数のほうがわかりやすいですよ。システム関数を呼び出すと、少しややこしいですから。でも、それも経験です。)
ブレークポイントで一度停止したあと、一行一行実行するのはうざったい、次に止まってもらいたいのは、7行先なのにと思ったでしょう。
そんな時は、カーソルまで実行を利用します。カーソルといってもエディターのキャレット(挿入マーク)のある位置です。マウスカーソルではありませんよ。
一度、デバッガを停止し、再度起動してください。before()の最初の行で実行ポイントが停止させましょう。
では、return文にキャレットを移動し、カーソルまで移動をクリックしてみてください。return文に実行ポイントが移動します。
NetBeansでデバッガーを動作させていると、ウィンドウの下部には、デバッグに関するウィンドウが開きます。その中に呼び出しスタックウィンドウが存在します。
もし、表示されていないようでしたら、ウィンドウ→デバッグ→呼び出しスタックで表示してください。
さて、これが今現在の実行ポイントがある場所まで、どのようにプログラムが実行されてきたのかを表示してくれています。一番下が、最初に呼び出されたもの、一番上が最後に呼び出されたものですから、当然ながら、実行ポイントがあるファイルのクラス名/関数名となります。ファイルパス、クラス、関数名、行ですね。
各項目をダブルクリックすることで、その呼び出し元へ移動することができます。試しに、どれかクリックしてみてください。
すると、呼び出している行はブレークポイントや実行ポイントとは違った色(設定が背景白で、呼び出し行も白ですとわかりません)で表示されており、行番号のところには三角形のアイコンが表示されています。これが、呼び出している行の印です。
では、この呼出しスタックを見ながら、上向き矢印のアイコン、ステップアウトをクリックしてください。段々と呼び出しスタックが、浅くなっていきます。
ステップアウトは、現在の関数などの呼び出しを終了し、一つ前の呼び出し元に戻るものです。呼び出し元に戻るのですが、そこで実行ポイントが更に先へ進みます。例えば、最初のindex.phpは38行目で呼び出しています。ステップオーバーでindex.phpへ戻った時、38行目の次の実行ステップである55行目へ進みます。38行目は例外処理のtryで囲まれており、例外が発生しなかったので、catchは実行されず、次の実行分である55行目へ進みました。
デバッグ中に編集すると、ブレークポイントの位置がずれることがあります。修正場所や状況によっては、編集内容に追従してくれるのですが、完全ではありません。ですから、これを忘れ、デバッグ中に編集すると、理解出来ない動きになります。
確実な方法は、デバッグ中は編集しないことです。編集したら、一度デバッガーを停止し、再度デバッグすることです。
さて、ブレークポイントで停止させたり、ステップ実行でプログラムの動きを追うのも、デバッガーの機能ですが、もう一つ重要なのが、変数の中身を確認することです。
では、やってみましょう。デバッガーを停止し、18行目、before()の最初の実行分にブレークポイントを設定してください。それから、デバッグ実行です。
停止したら、下のウィンドウに変数ウィンドウを表示してください。表示されていない場合は、ウィンドウ→デバッグ→変数で表示します。
このウィンドウは現在の変数の値が表示されます。配列や構造体は折りたたまれた状態で、表示されます。展開して中身を見てみましょう。
可能な場合は変数の値を変更も出来ます。やってみてください。
では、ステップ実行しながら、変数が生成され、変化していく様子を確認してください。
しばらく遊んでいると気づくと思います。クラスのstatic変数が表示されていません。
そう、これがNetBeansが使えないとか、xDebugが使えないとか言われてきた原因の一つです。
これもデバッガーで確認するためには、一度関数内のスコープの変数で受けてから、セットする方法で回避することは出来ます。ときどき、クラスの変数を一度変数に受けてから、利用するコードを見かけることがありますが、これが理由であるかも知れません。
現バージョンで確実だとは言い切れないのですが、表示する方法はあります。デバッガは終了しておきましょう。
ツール→オプション→PHP→デバッグでウォッチとバルーン評価にチェックを付けます。すると、不安定になることが報告されていると警告が出ます。ここでは構わず、続行してください。
警告されたとおりで、xDebugの実行時に不安定になります。正確に言えば、watchを指定した場合や(今は使用できませんが)式の評価を行った場合に、クラッシュします。xDebugはWebサーバーの拡張機能ですから、Webサーバーも巻き込みます。(全部のOSで試したわけでありません。安定しているものもあると思います。)
これも、バージョンや環境により現象の現れ方が異なっているため、こうすればいいと言えません。ダメならば、もとに戻す、そのために慎重に設定してください。一度にあちこちの設定をするとはまりますよ。
例えば、過去では起動するたびに落ちることもありました。最初は完全に機能していたのに、ある時からだめになり、それ以降は動作しなくなったこともありました。現在の最新バージョンで、私の環境では、watch式が存在している状態でデバッガーを起動すると、確実に落ちます。
それと、現在のNetBeans7.1では、ウォッチとバルーン評価にオプションが増え、構造の最大深さと子の最大数が設定できます。もし、ウォッチとバルーン評価にチェックを入れて、不安定になったのなら、この数値を小さくすることで、システムの負担を軽減し、安定させることが出来るかも知れません。
どの程度少なくするかは、環境により異なっているでしょう。ですから、答えを提示することはできません。皆さんが自分の環境で試してください。こうしたことが起きる可能性があるのだと覚えておき、必要に応じ、数値を小さくしたり、ウォッチとバルーン評価をオフにして安定させたり、出来るようにしましょう。
さて、危険性について説明した後は、利便性です。これが上手く動くのでしたら、クラスのstaticの値も確かめることができます。
バルーン評価が有効になっている場合、変数にマウスカーソルを当ててください。その変数の値がバルーンで表示されます。
残念ながら、スタティック関数にカーソルを当てても表示されません。式として、スタティック関数が評価できないからです。今回のサンプル中ではself::$yyyやstatic::$zzzを選択し、その選択範囲にカーソルを持って行ってください。選択範囲が評価され、バルーンに値が表示されます。
私の環境では、Watchに登録することも出来ます。Watchは登録した変数や、式を評価し、その値を表示する機能です。デバッガを起動するときにWatchに評価する式が存在すると、毎回確実にクラッシュしますが、起動時でなく、実行時(多分その式が評価できるライフタイム)であれば、クラッシュせず通常に使えます。
つまり、Watchに登録しっぱなしにせず、内容を確認したら、直ぐに削除するような使い方であれば、安全に使えています。(皆さんの環境でも使えると断言はできません。試しながら、確認してください。)
式を評価という機能もあるのですが、7.1では有効にできないようです。これは、クラッシュを引き起こす地雷のようでしたので、使えないようにしたのでしょう。
やっと使い方が理解できました。使用するためには、まずツール→オプション→PHP→デバッグで、要求されたURLを表示と、デバッガコンソールを表示にチェックを入れます。
どちらも、アウトプットウィンドウに表示されますので、開いておく必要があります。
要求されたURLを表示は、デバッグの対象になったURLを覚えていてくれるものです。クリックするだけで、そのURLが再送されますから、最初だけURLをごちょごちょと直し、その後はこれで表示されているリンクをクリックで、繰り返し実行ができるという機能です。
デバッガコンソールを表示は、生成したコードをそのまま表示するものです。ブラウザのソースを表示と同じですね。表示場所が、NetBeansの中であるということです。
通常Linuxのディストリビューションやxamppに含まれるxDebugは作成時の最新版です。xDebugは段々とバグがとれて行っていますが、未だ不安定なところも多く、前バージョンでできていたことが、できなくなったり、またその逆もあります。
全体としては、少しずつ改善されており、この記事で紹介したとおり、watchを使用しないなど、ポイントを押さえて利用すれば、十分に活用できます。
いずれにせよ、現時点のバージョンが上手く動作しない場合、自分の環境にあった、正しい最新版のxDebugをインストールすると、正しく動作する可能性があります。
Linuxをご利用の場合、ご自身のディストリビューションで、次のバージョンに向け、最新版が開発版に用意されていることもありますので、まずそちらをためしてみるのが先でしょう。
それではインストール手順です。
C:\xampp\php\php.ini and change the linezend_extension = \xampp\php\ext\php_xdebug-2.1.2-5.3-vc9.dllさて、ここまで書いたら、NetBeansに関して書くことがもうありません。次はプラグインを書き、そのあとは、なにか思いついたら、書きますので、NetBeans連続シリーズとしては次が最後です。
| FuelBeans 13 : ファイルとコードのテンプレート< 前 | 次 >FuelBeans 17 : NetBeansのプラグイン |
|---|
| < 前 | 次 > |
|---|