Vim + Vdebug + Xdebug でPHPのリモートデバッグ

最近はようやく本格的に vim を使ってコーディングするようになりましたが、まだまだ慣れない & 微妙な不満があったりします。 移動系がキーボードで全てできるのは、確かにかなり楽なように思えます。

話が変わりますが新しく違う言語を勉強しようと思う時、何を一番初めに調べますか? 構文はもちろん、インストール方法とか色々ありますよね。ボクが一番重要視してるのはデバッグ方法です。

どうやってデバッグするか。まずその方法などを調べます。 LL系言語の方は 変数を printしたりする方が多いらしいのですがボクはあまり好きではないので PHPの場合は Xdebugを利用してステップ実行させたりしてます。

print させるのが嫌いな理由は一つです。

「コードを書かなくちゃいけない」

これに尽きます。なんでデバッグするのにコード書くんだよ!って思ってます。

前置きが長くなりましたが、素晴らしいプラグイン Vdebug を見つけたので紹介します。

環境

  • CentOS 6.3
  • PHP 5.3.16
  • Vim 7.3 Python 2 support, +signs

Vim + Vdebug + Xdebug = awsome

phpenv + php-build で インストールしている場合は、デフォルトで xdebug がインストールされているはずです。 yum で php を インストールした場合は、以下のコマンドでインストールしておきます。

1
pecl install xdebug

Vdebug のインストール

vim のプラグイン管理は NeoBundleを利用してるので vimrcに以下の一文を追加して :NeoBundleInstall するだけです。

1
NeoBundle 'joonty/vdebug'

Xdebug の設定

yum や pecl でインストールした場合

yum や pecl でインストールした場合は、 /etc/php.d/xdebug.ini を新規作成します。

/etc/php.d/xdebug.ini
1
2
3
4
5
zend_extension=/usr/lib/php/modules/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

phpenv + phpbuild でインストールした場合

~/.phpenv/versions/5.x.xx/etc/conf.d/xdebug.ini の編集を行います。

~/.phpenv/versions/5.3.16/etc/conf.d/xdebug.ini
1
2
3
4
5
6
zend_extension="/root/.phpenv/versions/5.3.16/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so"
html_errors=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

Vdebug の使い方

Vdebug は基本的にはインストールするだけで利用できます。ブラウザと連携させる場合は、エクステンション(アドオン)をインストールする必要があります。

ボクはchromeを主に利用しているので、 をインストールして使用しています。 インストールするとアドレス入力部分に虫のアイコンが追加されます。

デバッグしたい場合、この虫のアイコンをクリックします。クリックすると虫が緑色に変わります。

これでブラウザ側の準備は整いました。次にvim側です。 止めたい箇所に、ブレイクポイントを打ちます。デフォルトでは F10 でブレイクポイントを設定することができます。

ブレイクポイントを打つと対象行がハイライト表示されます。

デバッガを起動させます。デフォルトでは F5 で起動します。起動後20秒待機し、待機中にブラウザからアクセスします。 正しく設定がされていると、下の画像のような画面に切り替わります。

左の画面がソースコード。 右の画面が4つに分割されます。上から

  • 変数表示画面
  • スタックトレース表示画面
  • デバッグ情報表示画面
  • デバッガーステータス画面

と構成されています。

あとはステップ実行させたり変数を評価したり思いのままです。デフォルトのキーマップは以下のようになっています。 英語のままの所は、ちょっと良く分からないです。すいません。

1
2
3
4
5
6
7
8
9
10
11
12
13
<F5>: デバッガの起動 / 次のブレイクポイントまで移動
<F2>: ステップオーバー
<F3>: ステップイン
<F4>: ステップアウト
<F6>: デバッガの停止
<F7>: デバッガーからデタッチ
<F9>: カーソル行まで実行
<F10>: ブレイクポイントの設定
<F11>: show context variables (e.g. after "eval")
<F12>: カーソル行の変数を評価
:Breakpoint <type> <args>: 色んな種類のブレイクポイントが打てる。 (see :help VdebugBreakpoints)
:VdebugEval <code>: <code>の変数を評価
<Leader>e: evaluate the expression under visual highlight and display the result

キーマップを変更したい場合は vimrcに以下のような設定を追加します。

~/.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
let g:vdebug_keymap = {
\    "run" : "<F5>",
\    "run_to_cursor" : "<F1>",
\    "step_over" : "<F2>",
\    "step_into" : "<F3>",
\    "step_out" : "<F4>",
\    "close" : "<F6>",
\    "detach" : "<F7>",
\    "set_breakpoint" : "<F10>",
\    "get_context" : "<F11>",
\    "eval_under_cursor" : "<F12>",
\}

待機時間や port などを変更したい場合は以下のような設定を追加します。

~/.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
let g:vdebug_options= {
\    "port" : 9000,
\    "server" : 'localhost',
\    "timeout" : 20,
\    "on_close" : 'detach',
\    "break_on_open" : 1,
\    "ide_key" : '',
\    "remote_path" : "",
\    "local_path" : "",
\    "debug_window_level" : 0,
\    "debug_file_level" : 0,
\    "debug_file" : "",
\}

このオプションをみると完全にIDEのようなリモートデバッグができそうですね。 まだ試していないので、今度試してみようと思います。

CLI PHPスクリプトのデバッグ方法

Unix Linux限定ですが、CLI上から実行するPHPスクリプトのデバッグ方法もあります。

以下のスクリプトを作成し、php-xdebug 等という名前で保存します。php のパスは適時置き換えて下さい。

php-xdebug
1
2
3
#!/bin/bash
export XDEBUG_CONFIG="idekey=xdebug"
/usr/bin/php "$@"

作成したファイルに実行権限を与え、パスが通っている場所に移動させます。

1
2
$ chmod +x php-xdebug
$ mv php-xdebug /usr/local/bin/

デバッガを起動し、デバッグしたいスクリプトをphp-xdebugコマンドで実行すると同じようにデバッグすることができます。

1
$ php-xdebug test.php

Vimでステップ実行させたい方 Vdebugかなりオススメですよ。是非使ってみて下さい!

参考

Vdebug Doc

Comments