Hatena::ブログ(Diary)

koziyの日記 RSSフィード

2008-01-02

[PHP][Xdebug][vim][firefox] vim で PHP の remote debug

に書かれているとおりに設定すれば vim から Xdebug の remote debug を実行できます。

vim サイドでやること

vim の feature で python と signs が有効になっている必要があり、RHELCentOS の場合は標準で有効になっていますので DBGp client プラグインインストールすればよく、Debianubuntu の場合は vim 本体と feature が別パッケージに分かれているので

sudo aptitude install vim-python

python feature をインストールすれば OK です。

なお、feature の有効/無効は vim --version で確認できます。

から debugger.zipダウンロードして $HOME/.vim/ の下に plugin ディレクトリを移動させれば DBGp client プラグインインストールは完了です。

PHP サイドでやること

PHP 側では

sudo pecl install xdebug

Xdebugインストールして、/etc/php.ini (Debian で PHP5 の場合は /etc/php5/apache/php.ini) に

[Zend]
zend_extension = /full/path/to/xdebug.so (xdebug.so のパスを設定してください)
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_host = localhost

Xdebug のロードと localhost:9000 で remote debug できるよう設定し、Apache再起動すれば完了です。

クライアント(ブラウザ)でやること(任意)

Xdebug のドキュメント - no title に記述されていますが、ブラウザから remote debug する際は XDEBUG_SESSION_START といったパラメータが必要となります。

手動で毎回設定するのは面倒なので FirefoxXdebug Helper 拡張で debug の ON/OFF を切り替えることをおすすめします。

Xdebug Helper をインストールして再起動するとステータスバー(一番したのところ)の左側に X なアイコンが表示されてクリックすると ON/OFF を切り替えることができます。

debug 方法

さて、これで debug 準備が整いましたので vim を起動します。このときファイルを指定しないで空の状態で起動しても構いません。

そして、F5 キーを押すと

waiting for a new connection on port 9000 for 5 seconds...

と表示されリクエストを受付中となりますのでブラウザから debug したいページにアクセスすると(先ほどの Xdebug Helper を使用する場合は X アイコンを ON にすることをお忘れなく:)、vim の画面が切り替わって remote debug モードになります。

HELP WINDOW に下記ヘルプが記述されており

[ Function Keys ]                 |                       
  <F1>   resize                   | [ Normal Mode ]       
  <F2>   step into                |   ,e  eval            
  <F3>   step over                |                       
  <F4>   step out                 |                       
  <F5>   run                      | [ Command Mode ]      
  <F6>   quit debugging           | :Bp toggle breakpoint 
                                  | :Up stack up          
  <F11>  get all context          | :Dn stack down        
  <F12>  get property at cursor   |                       

ファンクションキーでスッテプ実行等ができ、プレークポイントの設定はブレークポイントしたい行にカーソルを移動させ、そこで :Bp を入力すれば OK です。

そして、変数ウォッチは eval コマンドである ,e を入力すると WATCH_WINDOW にカーソルが移動します。

/*{{{1*/ => eval: 

ここでウォッチしたい変数を入力して Enter キーを入力すると中身が表示されます。たとえば、$_SERVER をウォッチすると下記のようになります。

/*{{{1*/ => eval: $_SERVER                                                                                                   
$command = 'eval';
 EVAL_RESULT          = (array) ;                                                                         /*{{{2*/           
  EVAL_RESULT          = (string) '200';                                                                                     
  EVAL_RESULT          = (string) 'www.example.com';                     
  EVAL_RESULT          = (string) 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ja-JP-mac; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9';
  EVAL_RESULT          = (string) 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
  EVAL_RESULT          = (string) 'ja,en-us;q=0.7,en;q=0.3';                                                                 
  EVAL_RESULT          = (string) 'gzip,deflate';
  EVAL_RESULT          = (string) 'Shift_JIS,utf-8;q=0.7,*;q=0.7';                                                           
  EVAL_RESULT          = (string) '300';                                                                                     
  EVAL_RESULT          = (string) 'keep-alive';                                                                              
  EVAL_RESULT          = (string) 'max-age=0';                                                                               
  EVAL_RESULT          = (string) '/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin';                                            
  EVAL_RESULT          = (string) '<address>Apache Server at centos.vm Port 80</address>';
  EVAL_RESULT          = (string) 'Apache';
  EVAL_RESULT          = (string) 'centos.vm';
  EVAL_RESULT          = (string) '10.211.55.10';
  EVAL_RESULT          = (string) '80';
  EVAL_RESULT          = (string) '10.211.55.7';
  EVAL_RESULT          = (string) '/var/www/html';
  EVAL_RESULT          = (string) 'webmaster@example.com';
  EVAL_RESULT          = (string) '/var/www/html/index.php';
  EVAL_RESULT          = (string) '50183';
  EVAL_RESULT          = (string) 'action=/';
  EVAL_RESULT          = (string) '/';
  EVAL_RESULT          = (string) 'CGI/1.1';
  EVAL_RESULT          = (string) 'HTTP/1.1';
  EVAL_RESULT          = (string) 'GET';
  EVAL_RESULT          = (string) 'action=/';
  EVAL_RESULT          = (string) '/';
  EVAL_RESULT          = (string) '/index.php';
  EVAL_RESULT          = (string) '/index.php';
  EVAL_RESULT          = (int) 1199248150;
                                                                                                          /*}}}2*/
/*}}}1*/

ひたすら var_dump や print_r やログに吐きまくるだけじゃなく、ステップ実行による debug ができるとやっぱりうれしいですね。しかもサーバサイドだけで(ほとんど)完結できるのが :)

vwzxzoczdsvwzxzoczds 2008/05/15 12:31 Wow, cool man, big thanks! <a href=http://yzjixhlxypgw.com >http://yzjixhlxypgw.com</a>

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。