Eclipse PDT でのリモートデバッグの整理

xdebug.remote_mode や xdebug.remote_autostart の設定がよくわからなかったので整理しました。

xdebug.remote_mode

req リクエスト開始時にデバッグセッションが開始されます
jit 最初にエラーが発生したときにデバッグセッションが開始されます

jit の場合はエラーが発生しない限りデバッグセッションが開始されないため、ブレークポイントを設定していてもエラーの行以降でしか止まりません。eclipse の設定で「PHP - デバッグ」の「最初の行でブレーク」を ON にしておけば、最初にエラーが発生したところでブレークさせることが出来ます。

<?php
$i = 1;	// ここにブレークポイントがあっても止まらない
$i = a;	// Noticeエラー、この時点でデバッガに接続される
$i = 2;	// ここにブレークポイントがある場合は止まる

xdebug.remote_autostart

On 常にリモードデバッグセッションが開始されます
Off GET/POST/COOKIE に(CLIの場合は環境変数に)特別な値が設定されている場合にデバッグセッションが開始されます

CLI の場合は環境変数XDEBUG_CONFIG」を設定していればデバッグセッションが開始されます。また、この環境変数を使って XDebug の設定を指定することも出来ます。

# idekey と接続先を指定してデバッグセッションを開始
export XDEBUG_CONFIG=idekey=ECLIPSE_DBGP remote_host=192.168.0.123
php sample.php

Web の場合 GET/POST に「XDEBUG_SESSION_START=」が指定されていると、デバッグセッションが開始されるとともに SetCookie レスポンスヘッダで「XDEBUG_SESSION=」が設定されます。

以降のりクエストでは GET/POST に何も指定しなくても COOKIE が設定されているため自動的にデバッグセッションが開始されます。


eclipseデバッグを開始すると、自動的に「XDEBUG_SESSION_START=ECLIPSE_DBGP」が付与されたURLが開かれます。が、私は Firefox の「easy Xdebug」拡張で COOKIE の ON/OFF を制御するようにしています。


xdebug.remote_mode=jit の場合はエラーの発生時にデバッグセッションが開始されるため、この設定は意味がありません。
(GET/POST/COOKIE環境変数による idekey などの指定は有効ですが、設定しなくても php.ini の設定でデバッグセッションは開始されます)。

xdebug.remote_connect_back

On の場合 xdebug.remote_host は無視されて REMOTE_ADDR が接続先として使用されます。DHCPなどでデバッガ側のIPアドレスが固定では無い場合に有用です。
CLI の場合は意味ないと思います。

eclipse 設定

メインメニューの「設定」から「PHP - デバッグ - インストール済みのデバッガー」を辿って「XDebug」を選択して「構成」ボタンクリックで設定画面が開きます。

eclipse の「リモート・セッション受信(JIT)」の設定

off JIT無効
ローカル・ホスト ローカルホストからの接続だけ受け入れます
任意 任意のホストからの接続を受け入れます
プロンプト 接続を受け入れるかどうかをプロンプトで問合せます

この設定はリモートの xdebug から eclipse に接続があったときにどのように振る舞うかの設定です。


off の場合、eclipseデバッグを開始していて、かつ、リモートの xdebug の idekey が ECLIPSE_DBGP であれば接続を受け入れます。

off 以外の場合、eclipseデバッグを開始していなくても常時ポートがリッスンされ、xdebug からの接続を受け入れてデバッグセッションが開始されます。このときのデバッグ構成は、メインメニューの「実行 - デバッグの構成」で設定したものは無く、設定の「PHP - デバッグ」で設定されているデフォルトの構成が使用されます。

なお、eclipseデバッグが開始済みで、かつ、リモートの xdebug の idekey が ECLIPSE_DBGP であれば開始済みのデバッグ構成が使用されます(JIT が off の場合と同じ挙動です)。