はじめに
PHPアプリケーションでは、 var_dump 、 debug_backtrace、およびその他の便利な関数を使用したデバッグは必ずしも便利ではなく、完全なデバッガーが必要です。 この記事は、何らかの理由で、NetBeansやPhpStormなどのPHPアプリケーションのデバッグをサポートするIDEを使用したくないが、これらの目的でvimを使用したい人のためのもので、デバッグはリモートホストで発生します。
vimにはDBGpクライアントプラグインがありますが、リモートマシンとローカルマシン上のすべてのファイルへのパスが同じ場合にのみ適切にデバッグできます。 たとえば、ローカルマシンがある場合:
/ホーム/ユーザー/アプリケーション/
/ホーム/ユーザー/フレームワーク/
また、リモートマシン上では次の場所にあります。
/ var / www / html / application /
/ var / www / framework /
「DBGpクライアント」を使用してアプリケーションをデバッグすることはできません。他のソースの場所について何も知らないためです。
この記事では、次のことを検討します。
- 簡単に説明すると、アプリケーションのリモートデバッグに必要なすべてを設定します。
- さまざまなパスをサポートするためのプラグインの変更。
- 簡単に説明すると、デバッガーを使用します。
設置
ローカルホストでvimを構成します
プラグインをダウンロードしてインストールします。
$ cd〜/ .vim
$ wget www.vim.org/scripts/download_script.php?src_id=7285 -O debugger.zip
$ Debugger.zip
$ rm debugger.zip
重要:vimはpythonサポートを使用してコンパイルする必要があります。「 :version 」を使用してこれを確認できます。出力にはストリング「+ python」が含まれている必要があります。
リモートホストにXdebugをインストールして構成する
Xdebug拡張機能を便利な方法でインストールします。 たとえば、Debian Squeezeでは、これは単純に行われます。
#apt-get php5-xdebugをインストール
ただし、一般的には、 公式のインストール手順を読むことをお勧めします。
ローカルデバッグクライアントへの接続を設定します-このために、php.iniに次の行を記述し、192.168.1.110をローカルマシンのIPに置き換えます(必要に応じてポートも再設定できます)。
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_host = 192.168.1.110
ファイル一致の構成
アイデアは簡単です-ブレークポイントをインストールするなど、デバッガーにリクエストを送信するとき、デバッガーから情報を受信するとき(たとえば、ある行にあるなど)、ローカルホストのパスをリモートホストのパスに変換する必要があります一部のファイル)、逆変換を行う必要があります。
debugger.pyファイルの最後に次のコードを追加します。
class FileMapping: def __init__(self, mapping_file): self.local_to_remote = {} self.remote_to_local = {} mapping = open(mapping_file, 'r') for line in mapping: local, remote = line.split(' ') local = local.strip() remote = remote.strip() if not (local in self.local_to_remote): self.local_to_remote[local] = [] self.local_to_remote[local].append(remote) if not (remote in self.remote_to_local): self.remote_to_local[remote] = [] self.remote_to_local[remote].append(local) def local_to_remote_file(self, local): for local_path in self.local_to_remote.keys(): if local.startswith(local_path): # use the first mapping as we don't know which one we should take remote_path = self.local_to_remote[local_path][0] return remote_path + local[len(local_path):] def remote_to_local_file(self, remote): for remote_path in self.remote_to_local.keys(): if remote.startswith(remote_path): for local_path in self.remote_to_local[remote_path]: local = local_path + remote[len(remote_path):] # use the first existing file if os.path.exists(local): return local return None file_mapping = FileMapping('/home/alexey/mapping')
そして、 マッピングファイル( / home / alexey / mapping-パスに置き換えてください)に、ローカルディレクトリとリモートディレクトリの対応を書きます、例えば:
/ホーム/ alexey /フレームワーク/ var / www /フレームワーク
/ホーム/ alexey /アプリケーション/ var / www / html
Xdebugのファイル名の場所を探してプラグインコードを調べます。 その結果、それらはすべて、1つのメソッドの呼び出しに集約されます-set_srcview、最初にファイル名に変更を追加します。
def set_srcview(self, file, line): """ set srcview windows to file:line and replace current sign """ file = file_mapping.remote_to_local_file(file)
反対に、ファイル名がデバッグクライアントからXdebugに転送される場所を探しています。 そのような場所は2つあります。
1.デバッガークラス、メソッドの実行、文字列の置換
'-t line -f ' + self.breakpt.getfile(bno) + ' -n ' + str(self.breakpt.getline(bno)) + ' -s enabled', \
に
'-t line -f ' + file_mapping.local_to_remote_file(self.breakpt.getfile(bno)) + ' -n ' + str(self.breakpt.getline(bno)) + ' -s enabled', \
2. Debuggerクラス、markメソッド、次の行を置き換えます。
'-t line -f ' + self.breakpt.getfile(bno) + ' -n ' + str(self.breakpt.getline(bno)), \
に
'-t line -f ' + file_mapping.local_to_remote_file(self.breakpt.getfile(bno)) + ' -n ' + str(self.breakpt.getline(bno)), \
すでに修正済みのdebugger.pyは、 ここから入手できます 。
使用する
デバッグを実行する
Webアプリケーションのデバッグを開始するには、vimを起動して<F5>を押す必要があります。
次に、5秒以内に(間隔を増やす方法については以下で説明します)、XDEBUG_SESSION_START変数に1の値を渡してGETに渡すことにより、PHPスクリプトを実行する必要があります。たとえば、ブラウザーで対応するページを開くだけです。
webdev / debug.php?XDEBUG_SESSION_START = 1
または、php.iniでxdebug.remote_autostart変数を設定できます。 この場合、PHPスクリプトを実行すると、Xdebugはデバッグクライアントへの接続を試みます。
詳細については、 公式のXdebugドキュメントを参照してください 。
結果は次のようになります-実行するスクリプトが開きます。
右側のウィンドウ-上から下:
- 上映ウィンドウ-コンテキストの表示
- ヘルプウィンドウ-簡単な説明
- STACK WINDOW-関数呼び出しスタック
- TRACE WINDOW-Xdebugを使用してクライアント通信ログをデバッグします。デバッグが機能していないかどうかを確認すると便利です。
自分用のカスタマイズ
タイムアウトは、debugger.pyの行を見つけることにより、同じスクリプトで設定できます。
serv.listen(5)
5を必要な秒数に置き換えます。
キーの組み合わせは、debugger.vimで設定されます。たとえば、<F5>を「、dr」を押すように再割り当てします。
マップ、dr:python debugger_run()<cr>
ヘルプウィンドウのテキストは、HelpWindowクラスのon_createメソッドで変更できます。
コードナビゲーション
ここでは詳しく説明しませんが、他のデバッガーとの違いは最小限です。
- ステップイン(<F2>)-内部に関数を入力するステップ。
- ステップオーバー(<F3>)-関数内に入らないステップ。
- ステップアウト(<F4>)-スタックの上の関数を終了します。
- 実行(<F5>)-次のブレークポイントまで実行を継続します。
- Stack up(:Up)-スタックを上に移動します(スタックウィンドウを参照)。
- Stack down(:Dn)-スタックを下に移動します(スタックウィンドウを参照)。
現在のステータスを表示
- Property get(<F12>)-変数の値を取得します(目的の変数にカーソルを置き、<F12>を押す必要があります)。
- Context get(<F11>)-現在のコンテキスト全体を取得します(大まかに言うと、このコンテキストで使用可能なすべての変数)。
- Eval(、e)-現在のコンテキストで任意の式を実行し、その値を取得します。
スクリーンショット-Context getおよびEvalが実行されたWATCH WINDOW:
ブレークポイントをインストールする
ブレークポイントの切り替え(:Bp)-現在の行にブレークポイントを設定するか、既に存在する場合は削除します。
スクリーンショットでは、緑の線はブレークポイントのある線、赤は現在の線です:
サイズ変更
さらに、<F1>により、2つのモードを切り替えることができます-さまざまな補助ウィンドウが右側に表示される場合はフル、コードがあるウィンドウのみが残る場合はシンプルです。