PhpStormとXdebugを使ってJust-In-Timeデバッグと例外ブレークポイント
どんなプロジェクトでもコードが安定してデバッガをアタッチし続けなくても良いと思うタイミングがあります。またはコードを動かし続けて例外が発生した時だけデバッガをアタッチしたいこともあるでしょう。そんなときはPhpStormでXdebugの just-in-time(jit)モードと例外ブレークポイントを使いましょう!
デフォルトでXdebugはリモートデバッグを有効化し、特別なHTTP GET/POSTパラメータを送ってデバッガを有効化した場合のみIDEと接続できます。しかしxdebug.remote_modeの設定をすればエラーが発生したときすぐにXdebugが接続するようにできます。このパラメータをデフォルト(“req”)のかわりに “jit”と指定します。このパラメータは静的にphp.iniで指定することも、動的にスクリプトでini_set(‘xdebug.remote_mode’, ‘jit’);として指定することもできます。
remote_modeの設定によりXdebugがどのタイミングで初期化されるかが決まります。デフォルトの”req”だとスクリプトが起動した際にデバッグセッションが始まります。”jit”の場合はエラーまたは例外が発生した場合のみデバッグセッションが始まります。
簡単なコード例をお見せします。PhpStormがデバッガからの接続を受け付けるようにツールバーから、または[Run | Start Listen for PHP Debug Connections]メニューから設定しておくと、Xdebugは0で除算をした場合などエラー発生時にのみIDEに接続します。うっかりと0で除算するコードが紛れてしまっており、PhpStormのデバッガがアタッチしている様子が以下のスクリーンショットでおわかりになるかと存じます:
上のスクリーンショットから、PhpStormはエラーが発生した瞬間の状態で実行を一時停止させているのが分かります。
また別の例でPhpStormが例外発生時にアタッチする様子をお見せします。デバッガがキャッチブロックがあればブロック内の先頭で、またはPHP 5.5であればfinallyブロックで止まります:
なお、php.iniでjitデバッグを有効化している場合、伝統的なHTTP GET/POSTパラメータでデバッグの有効化をする方法は効かなくなることに注意してください。
PHP例外ブレークポイント
jitデバッグに続いて最新のPhpStorm 7.1ではPHP例外ブレークポイント機能があります。この機能を使うとスクリプトの先頭でデバッガを起動し、任意のブレークポイントで、または指定したエラーか例外タイプが発生した箇所でブレークさせることが出来ます。PHP例外ブレークポイント機能を使うのにXdebugのremote_modeを”jit”に設定する必要はありません。
ブレークポイントウィンドウは[Run | View Breakpoints…]で開くことができ、ブレークしたいエラーや例外を指定することができます。このウインドウではカスタム例外タイプやWarning、Notice、Deprecatedでブレークするように指定出来ます。なおE_ERROR、E_PARSE、E_COMPILE_ERROR発生時はPHPの実行自体が止まってしまうためブレークできません:
デバッガがエラーか例外でブレークした際、PhpStormは関連情報をいくらか提示してくれます。たとえばタイプを確認するにはブレークポイントにマウスカーソルを重ねてみてください:
もっと詳しい情報はerror_get_last()関数にウォッチを追加することで確認できます:
是非お試しの上、何か気になることがありましたらYouTrackへ報告するか、掲示板へご記入ください!
Develop with pleasure!
– JetBrains PhpStorm チーム