PHP でのデバッグ方法

riaf: 明日になったら heavenshell さんのブログにデバグ方法のエントリがあがってるんだろーなー♪[00:27]
heavenshell: var_dumpの方が速いというオチもw[00:27] 
riaf: たのしみだーなー♪[00:27] 
heavenshell: ちょwww[00:27] 
heavenshell: 頑張ります><[00:28] 
wozozo がトピックを “heavenshellのブログにデバッグ方法!こうご期待” に変更しました。[00:28] 
riaf: wwww[00:28] 
heavenshell: www[00:28] 

と zf-users.jp の IRC で振られたので… ww
# あくまでも自分のやり方。もっと効率の良い方法があるかもしれない。


PHP での値の確認とかは基本的に var_dump() と die() を使ってやってる。
殆どの場合これで事足りるんだけど、 Zend Framework やライブラリの内部の流れ追いたい時は効率が悪い。
こういう時にブレークポイントとかステップ実行が出来たら便利。


以前、id:i_ogi さんが日記に Andrei Zmievski さんの vim についての資料を翻訳されていて、その中で Xdebug を利用したデバッグ方法が書かれていた。
(PHP)プログラマのためのVIM (11) - PHP向けカスタマイズ(3) Andreiがつかってるプラグイン - おぎろぐはてブロ
これを読んで試してみたら結構使えたので、それ以来ソースの流れを追いたい時には リモートデバッグを使用している。

必要な物

環境は Mac OS 10.5.4, PHP5.2.6, Xdebug2.0.3, Firefox3, Vim7.1 +python という環境。
おそらく Linux でも動くと思う。。。


Xdebug をインストールして、 php.ini に以下のように設定する。

xdebug.remote_autostart=On
xdebug.remote_enable=On
xdebug.remote_handler=dbgp

dbgp が デフォルトで 9000 番ポートを使う。ポート番号を変更したい場合は、 php.ini に変更を追加し、 .vimrc にもポート番号を変更する設定を書く必要がある。ややこしいのでデフォルトのままで使用している。


VimXdebug をサポートしてくれるプラグインをダウンロードして、 $HOME/.vim/plugin に設置する。
remote PHP debugger - remote debugger interface to DBGp protocol. : vim online
DBGp client - a remote debugger interface to the DBGp protocol (tested only with XDebug/PHP) : vim online
上がオリジナルだけど、それを改変したのが下のプラグインらしい。。。自分は下のプラグインを使用。
このプラグインPython で作られているので、 Vim が +python 付きでコンパイルされている必要がある。
# vim --version とかして +python となっていれば OK 。なっていなければ、 Python 付きで Vim の再コンパイルが必要。

使い方

VimPHP なファイルを開き、 F5 キーを押すと、「waiting for a new connection on port 9000 for 5 seconds...」と表示される。
この 5 秒の間に、ブラウザから該当のファイルを実行する事になる。
参考にさせて頂いたサイトでは、URI の末尾に、XDEBUG_SESSION_START=セッションID を付けろと解説しているんだけど、いちいち毎回付けるのはめんどくさいので、 FirefoxXdebug Session のプラグインをインストールしておけば便利。
https://addons.mozilla.org/en-US/firefox/addon/3960

  1. Firefox のステータスバーにある Xdebug のボタンをクリック
  2. Vim で F5 を押す
  3. ブラウザで該当ページにアクセスする

この一連の流れを行うと、 Vim 上でデバッガが起動する。
# ステータスバーの Xdebug のボタンを押さずに実行したら普通にデバッガが起動したのでひょっとしたら不要なのかも。。。


こんな風にデバッガが起動したら、後は F2 キーや F3 キーを押してステップ実行を行う。

  • F2 :ステップイン
  • F3 :ステップオーバ
  • F5 :デバッガの起動 (デバッガ起動時はブレークポイントまで実行)
  • F6 :デバッガの終了
  • F11:全ての変数の値を表示
  • F12:カーソルの下にある変数の値の表示

# デバッガの使い方の説明は Vimプラグインのページに記述されているのでそちらを参考に。
remote PHP debugger - remote debugger interface to DBGp protocol. : vim online


デバッガを起動すると毎回エントリポイントのファイルの先頭が開始位置になる。
# 例えば、 http://example.com/debug.php がエントリポイントだと、 debug.php の先頭が開始位置になる。


そこから目的地までずっとステップ実行しても良いけど、フレームワークなどの階層が深い場合は、目的の場所までステップ実行するのはキツいので、ブレークポイントを使う。
ブレークポイントを張りたい所で、:Bp とコマンドを打つと、Vim の左側に B> と表示される。

これで Vim の F5 キーを押してデバッガを起動し、ブラウザからアクセスし、更に vim で F5 キーを押すとブレークポイントを張った行まで移動してくれる。


あと便利な使い方として、デバッグ中にコマンドで、 ,e と打つとコマンドが実行できるので、例えば $hoge という変数の中身を見たい場合は、 ,e と入力し、 $hoge と入力すると変数の中が見れるようになる。
ちょっとした確認には便利。

まとめ

PDT でのリモートデバッグをやった事がないので比べられないけど、Vim でも一通りのステップ実行が出来る。
ただし、デバッガを起動するまでに少しステップを踏まないといけないので、 var_dump() と die() を駆使した方が速い時もある。
# ここらへんは使い分けだと思う。


あとリモートデバッグを使用しなくても Xdebug は配列を階層表示したり、色づけしてくれるので、非常に便利。
Fatal Error 時のスタックトレースとかもやってくれるし。


目新しい情報ではないけど、こういう PHPデバッグ方法もあるという紹介でした。