Edited at

VisualStudioCodeのデバッグでどうしてもブレークで止まらない場合 (PHP Xdebug)

More than 1 year has passed since last update.

【追記】2018/04/12(木)

1.22.1 のバージョンアップでふと確認した所、 stopOnEntry を指定しなくてもちゃんと止まるようになっていました。

この記事を書いた際のバージョンが 1.20.1 で、こちらでも再度試したらちゃんとブレークポイントを設定した所で止まりましたので、何か他に原因があったのかもしれません。


結論

"stopOnEntry": trueを加えたら止まるようになりました。


launch.json

{

"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000,
"stopOnEntry": true,
"log": true,
"pathMappings": {
"/var/www/html": "${workspaceRoot}"
}
}
]
}


原因

よくわかりません。

これまで、Visual Studio Codeでデバッグしたことは無く、設定なども見よう見まねでやっていたのですが、どうしてもうまく行かず、PHP Debug - Visual Studio MarketplaceSupported launch.json settings:を見ていたところ、stopOnEntryの記述があり、試したら先頭で止まるようになりました。

先頭で止まったら、その後はブレークポイントでも止まるようになりました。

NetBeansではすんなりデバッグできましたので、後一歩何かが足りないのだろうという状況でした。


Xdebugでうまく行かないと言う時に確認する所

PHPはずっと昔にちょっと使った程度で、ほとんど知識がありません。

とりあえず自宅環境でVagrantで適当に環境構築を進めましたが、色々と知らなすぎて、どこが悪いかも最初は把握するのに苦労しました。

今回の環境はWindows 7Vagrantcentos/7のboxを使用。

記事を参考にまずはPHPのインストールとXdebugをインストール。

その後、、、

1. ともかく、<?php phpinfo(); ?>を実行させて結果を見る

サーバー側で php -iの結果をgrepなどで確認してもよいかもしれませんが、ブラウザで見れた方が勝手が良いかと思いますので、ここでアドレスやらポートやらの確認を。

そして、Xdebugが有効になっているか確認を。

次の表示でのwith Xdebugの部分が出ていればXdebugは読込まれています。

image.png

(※最初zend_extension=xdebug.soの指定が間違えているのではと悩みました)

2. そもそも設定はどこにあるのか

何かしらの記事を参考にしていると環境によってパスが異なるので、自分の環境のどこにファイルがあるのかわからない場合もあるかと思います。

phpinfo()の結果かもしくはphp -iの結果で、Loaded Configuration Fileの部分がそもそものphp.iniのありか。

他、Additional .ini files parsedxdebug.iniがあるかと思いますので、ブラウザでとにかくxdebugで検索してみるか、php -i | grep xdebug.iniなどで確認するとわかるんじゃないかなと思います。

3. xdebug.remote_port は 9000で

これはちょっと恥ずかしい話ですが、現状9000以外の設定で行なうとうまくいっていません。NetBeansの方でもです。

なので、特別な事情でもなければ、ともかくデフォルトの9000で行った方が無難そうです。

4. xdebug.remote_host もいっその事設定しない

xdebug.remote_hostはxdebugを送信側として、受信側のアドレスとなるようなので、デバッグを行なうクライアント側のアドレスを入力すればよく、phpinfo();での$_SERVER['REMOTE_ADDR']の値を設定すればよいのだと思いますが、よくわからなければ、xdebugの設定をxdebug.remote_connect_back = 1とすれば、何とかなるかと思います。

逆に、xdebug.remote_connect_back = 1でダメな場合もあるようなので注意。

5. Apacheの再起動を忘れずに

sudo systemctl restart httpdなど、Apacheの再起動を忘れずに。

設定変更してこれを忘れて、うまく行かずに、別の設定を試すと言う事をしてしまうと迷宮まっしぐらです。

6. 結局行き着いた設定

最終的に、自分の環境では次のように設定しています。


/etc/php.d/15-xdebug.ini

xdebug.remote_enable = 1

xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1

これで、NetBeansVisual Studio Codeでもデバッグできるようになりました。

"stopOnEntry": trueで止まるようになるまでが長い道のりでした。

以上


参考にした記事など