OSX + PHP + xdebug + DBGPavimでprintデバッグからの卒業

brookhong/DBGPavim https://github.com/brookhong/DBGPavim

f:id:kanetann:20131120231229p:plain

大まかなインストール手順

Vimを+pythonにして、NeoBundleでDBGPavimをインストールして、

README.mdに書いてあるとおりにphp.ini、.vimrc、httpd-vhosts.confに設定すればOKです。

PHPだけじゃなく、Pythonでも使えます。

rubyvim-ruby-debuggerがあります。

キー操作

以下のとおりです。バインドは好きに変更できます。

In normal mode

<F5>      => start debugger backend
<F6>      => stop debugger backend
<F8>      => toggle dbgPavimBreakAtEntry, when g:dbgPavimBreakAtEntry=0, debugger backend breaks only at breakpoints.
<F10>     => toggle breakpoint at current line

:Bl        => to list all breakpoints
:Bp [expr] => toggle breakpoint on current line, if expr is provided, that is conditional breakpoint, for example, `:Bp ($i > 3)` only breaks when $i is larger than 3.
:Dp [args] => to debug current file from CLI, it will run 'php -dxdebug.remote_autostart=1 -dxdebug.remote_port=<your_port> <curret_file_in_vim> [args]'


:Wc [$foo] => to toggle watch on variable $foo, if no parameter is provided, it will toggle watch on CONTEXT.
:We [foo]  => to eval expression `foo` automatically after each step.
:Wl        => to list all watched variables. By default, you can get output like *CONTEXT*, which means context are automatically populated each step in WATCH WINDOW.

In debugging mode

<F1>      => toggle help window
<F2>      => step into
<F3>      => step over
<F4>      => step out
<F5>      => start debugging / run
<F6>      => stop debugging
<F7>      => evalute expression and display result. cursor is automatically move to watch window. type line and just press `Enter`.
<F9>      => toggle layout
<F11>     => shows all variables
<F12>     => shows variable on current cursor

デバッグの流れ

  • F10でブレークポイントを設定
  • F5でデバッグモード開始
  • ブラウザからアクセスすればブレークポイントで停止する
  • F3でstep over
  • F2でstep into、F4でstepout、F5で次のブレークポイントまで進み、F6でデバッグを終了
  • F11でスコープ内のすべての変数を確認できる、arrayはEnterで展開できる
  • F12で選択した変数を確認できる
  • :Wc [$foo]で指定した変数をウォッチできる
  • :Wlでウォッチしている変数の一覧を確認できる

と言った感じでIDEライクにデバッグできます。

雑感

たまーにPHP書いたりすると、print文を埋め込んでたり、ログを埋め込みまくって値を見失ったりしてて効率悪すぎてですね。

フレームワークソースコードにprint文埋め込むのに抵抗があったりとか、もう精神的にしんどい。

デバッガを使えば変数を確認したいところにブレークポイントを設定して、コードを汚さずにさくっと確認できるのがとってもいい。

Googleを支える技術読んでたら、Debugging sucks. Testing rocks.と書いてて、そうだよなあとか真に受けてたんですけど。

f:id:kanetann:20131120231224j:plain

テストコード書いてる最中にデバッグしたくなることがままあって、そういうときにprint文じゃなくてデバッガほしい、IDEうらやましいとかずっと思ってました。

でも、NetBeansはメモリを大量に使ってたり、javaのエラーに悩まされてるエンジニアがすぐ隣にいて踏み出せず。

IDEに移行することで学習コストが発生するのと、vimの軽快さが失われるのがイヤで手が出せてなかったのですが、積年の想いにピリオドを打つことができそうです。

ま、たまにvimごと固まってkillしなきゃいけなくなることがあるんですけどね。。