PHPはずっとPHPStormで書いていて不自由はなかったのですが、最近他の言語でvimを使いだしたところ、全部vimでやりたくなる一過性の病にかかったのでPHPでデバッグ環境を整えています。
PHPのxdebugを実行するのにvimのプラグインVdebugを使います。
vim-vdebug/vdebug: Multi-language DBGP debugger client for Vim (PHP, Python, Perl, Ruby, etc.)
全部マニュアルに書いてあるので読めば終了なんですが、せっかく触りながらマニュアルの内容を確かめたので備忘として残しておきます。
ただし、CLIでローカル実行した場合についてです。
ブラウザからのリクエストで起動する場合やリモートデバッグはまたいつか追記するかもしれません。
インストール・初期設定
xdebugのインストールはすでにたくさん記事があるので省略。
Vdebugのインストール
僕はPlugin managerにjunegunn/vim-plugを使っています。
call plug#begin('~/.vim/plugged')
" Debug
Plug 'vim-vdebug/vdebug'
call plug#end()
.vimrcに追記してから
:PlugInstall
呼び出しスクリプトの作成
また、CLIから実行する場合は、環境変数XDEBUG_CONFIG
でidekey
の指定が必要です。毎回打つのが面倒なのでショートカット用のshellscriptを作ります。
#!/bin/bash
export XDEBUG_CONFIG="idekey=xdebug"
/usr/bin/php "$@"
phpのパスは環境に合わせます。
実行権限付与して適宜パスの通っている場所に移します。
$ chmod +x php-xdebug
$ mv php-xdebug /to/your/path/
こんな風に使用。
$ php-xdebug myscript.php
使い方
基本の使い方
- 止めたい行にブレークポイントを設置(F10)
- Debuggerをスタート(F5)
- Terminal別タブでそのブレークポイントを通過する処理を呼び出し
- Debuggerをストップ(F6を2回)
windowの見方
よく使うキーバインド
- F5・・Start
- F6・・Stop
- F2・・Step Over
- F3・・Step In
- F4・・Step Out
- F9・・Run To Cursor
- F10・・Toggle Break Point
ブレークポイント
- F10でtoggle
-
:BreakpointWindow
でブレークポイント一覧を確認- このウィンドウで消したいブレークポイントの行にカーソルをあわせて
dd
で該当ブレークポイントを削除
- このウィンドウで消したいブレークポイントの行にカーソルをあわせて
-
:BreakpointRemove *
で一括削除
いろんなブレークポイント
F10の通常の行ブレークポイント以外にいくつかの特性を持ったブレークポイントを利用できます。
:Breakpoint <type> <arguments>
conditional
行ブレークポイントと似ていますが、ブレークが発動する条件を指定できます。
使い所は「ループの◯回目のみ止めたい」とかですかね。
標準の行ブレークポイント以外では唯一これだけ使いそうな気がします。
:Breakpoint conditional $x == 2
exception
指定した例外が発生した場合にブレークする
:Breakpoint exception PDOException
call
指定の関数が呼び出された場合にブレークする。マニュアルを見るに、挙動は保証されていないようです。
:Breakpoint call open_file
return
指定の関数からreturnされた場合にブレークする。同じく、挙動は保証されていないようです。
:Breakpoint return open_file
watch
指定の変数に書き込みがあった場合にブレークする。マニュアルにはxdebugでサポートされていないので期待するなと書いてあります。僕の環境では動かなかったです。特に期待してなかったので大丈夫でした。
:Breakpoint watch $myvar
任意の式の評価
実行ポイントのコンテキストで任意の式を評価させることができます。デバッガーの醍醐味とも言える機能ですね。
実行方法が3種類あります。
1) 記述した式を評価する方法
:VdebugEval $x * 3
これはwatch windowに表示されますが、ステップを進めるとデフォルトのwatch windowに戻ります。
指定した式の評価をwatch windowに固定表示させたい場合は:VdebugEval!
を使います。
:VdebugEval! $x * 3
デフォルトのwatch windowに戻したい場合は式無しで以下を打ち込みます
:VdebugEval!
2)visualモードで選択した式を評価する方法
v
で選択後 <leader>e
で評価
3) traceウィンドウで評価を確認する
:VdebugTrace
を使うとwatch windowとは別にtrace windowで式をトレースできます。
VdebugEval!
と似ていますが、watch windowをデフォルトとのままにしつつ式の評価を追うことができます。
:VdebugTrace $x
細かい設定とか
デフォルトオプション
let g:vdebug_options = {
\ 'port' : 9000,
\ 'timeout' : 20,
\ 'server' : '',
\ 'on_close' : 'stop',
\ 'break_on_open' : 1,
\ 'ide_key' : '',
\ 'debug_window_level' : 0,
\ 'debug_file_level' : 0,
\ 'debug_file' : '',
\ 'path_maps' : {},
\ 'watch_window_style' : 'expanded',
\ 'marker_default' : '⬦',
\ 'marker_closed_tree' : '▸',
\ 'marker_open_tree' : '▾',
\ 'sign_breakpoint' : '▷',
\ 'sign_current' : '▶',
\ 'continuous_mode' : 1,
\ 'simplified_status': 1,
\ 'layout': 'vertical',
\}
個別で上書き
if !exists('g:vdebug_options')
let g:vdebug_options = {}
endif
let g:vdebug_options.port = 9001
まとめて上書き
let g:vdebug_options = {
\ '"port' : 9000,
\ 'break_on_open' : 0,
\ 'ide_key' : '',
\}
基本はデフォルトのまま使っていますが、break_on_open
は0にしています。これは実行されるスクリプトの1行目でステップが止まるかどうかの指定です。ブレークポイントより前で止まっても鬱陶しいのでオフにしています。
レイアウト
g:vdebug_options.layout
にhorizontal
を指定するとレイアウトがデフォルトから変わります。
感想
- evaluationを複数同時にtraceできない点以外はIDEの場合とくらべて特に不便とかはなかったです。