Xdebug + VimでPHPのWebアプリをステップ実行してみた
PHPerの強力な味方var_dump。
しかし、あまりにもvar_dumpにばかり頼っていると、「えーマジvar_dump?」「var_dumpデバッグが許されるのは小学生までだよねー」などと罵られかねません。
そこで、今回は脱var_dumpデバッグを目指し、Xdebug + VimでPHPのWebアプリをステップ実行してみます。
debugger.vimのインストール
下記サイトからdebugger.zipをダウンロードします。
http://www.vim.org/scripts/script.php?script_id=1929
ダウンロードしたdebugger.zipを.vimディレクトリに展開します。
$ cd ~/.vim $ unzip ~/Downloads/debugger.zip
これでdebugger.vimのインストールは完了です。
debugger.vimが起動することを確認します。
まず、ファイル名の指定なしでVimを起動します。
$ vim
Vimが起動したら、fn + F5を押します。
waiting for a new connection on port 9000 for 5 seconds...
というメッセージが出力され9000ポートでListenが始まればインストールはOKです。
もしListenが始まらない場合は、VimのPythonインタフェースが有効になっていない可能性があります。
下記コマンドでPythonインタフェースが有効になっているか確認します。
$ vim --version | grep python +persistent_undo +postscript +printer -profile -python -python3 +quickfix
「+python」となっていれば有効になっています。
「-python」となっている場合は有効になっていないので、Vimを再インストールする必要があります。
下記コマンドでVimをアンインストール。
$ sudo port clean vim
そして「+python27」オプションをつけてVimを再インストール。
$ sudo port install vim +python27
インストールが終わるまで時間がかかるので、コーヒーでも飲みながら待っていてください。
インストールが終わったら、Pythonインタフェースが有効になっていることを確認します。
$ vim --version | grep python +python -python3 +quickfix +reltime -rightleft +ruby +scrollbind +signs リンク: /usr/bin/gcc-4.2 -L. -L/opt/local/lib -L/opt/local/lib -arch x86_64 -o vim -lncurses -liconv -lintl -framework Cocoa -L/opt/local/lib -fstack-protector -L/opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/CORE -lperl -lm -lutil -lc -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 -framework CoreFoundation -u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python -lruby -lobjc -L/opt/local/lib
今度はOKです。
再度Vimを起動してfn + F5を押してみてください。
今度はListenが始まるはずです。
Xdebugのインストール
Peclで一発で入ります。
$ sudo pecl install xdebug
インストールできたことを確認します。
$ pecl list Installed packages, channel pecl.php.net: ========================================= Package Version State xdebug 2.2.1 stable
[Zend] zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so [Xdebug] xdebug.default_enable = true xdebug.remote_enable = true xdebug.remote_host = localhost xdebug.remote_port = 9000 xdebug.remote_connect_back = false xdebug.remote_cookie_expire_time = 3600 xdebug.remote_handler = dbgp xdebug.remote_log = /var/tmp/xdebug.log
設定が有効になっていることを確認します。
$ php -r "phpinfo();" | grep -i xdebug
でXdebug関連の設定がずらずらと表示されれば、とりあえず設定はOKです。
ステップ実行
下記のサンプルプログラムをステップ実行してみます。
index.php
<?php $food = array( 'Japanease' => 'Sushi', 'Italian' => 'Pizza' ); $nation = 'Japanease'; echo "I love $nation[$food]. Because I am $nation.";
上記のindex.phpをApacheのドキュメントルートに配置してください。
Vimを起動して9000ポートでListenしている状態で、http://$HOSTNAME/index.php?XDEBUG_SESSION_STARTにリクエストを送信します。
URLに?XDEBUG_SESSION_STARTをつけないとApacheがXdebugを使用してくれないので注意してください。
リクエストを送信すると、デバッガが起動します。
fn + F3でステップ実行できます。
fn + F5でプログラムを最後まで実行すると、
ブラウザに「I love Sushi. Because I am Japanease.」と表示されます。
今度はブレークポイントを設定してみます。
Vimでindex.phpを開き、9行目にカーソルをあわせて「:Bp」押し、ブレークポイントを設定します。
index.phpを開いたままfn + F5を押してリクエストを送信すると、ブレークポイント付きでデバッガが起動します。
fn + F5で実行すると、ブレークポイントを設定した行でプログラムの実行が停止します。
ここで変数の値を参照してみます。
「,e」と入力すると、カーソルがWATCH_WINDOWに移動します。
「/*{{{1*/ => eval:」と聞かれるので、「$nation;」と入力しエンターを押すと、$nationの値を表示できます。
変数の値を書き換えることも可能です。
「,e」と入力しWATCH_WINDOWに移動したあと、今度は「$nation = 'Italian';」と入力します。
すると、$nationの値を書き換えることが可能です。
この状態でfn + F5を押してプログラムを実行すると、今度はブラウザに「I love Pizza. Because I am Italian.」と表示されます。