SSブログ

VSCodeでリモートでPHP Debugをブレークできないのをできるようにした。 [プログラミング]

Visual Studio Codeを使って、リモートでXdebugを使うというなんともうれしい機能があったけど、ブレークポイントで止まらずハマったという話。他のサイトでスクリーンショットを使ったりして手取り足取り教えてくれているのであえてここでは、自分のVirtualBoxにつなぐ環境でこうしたら上手くいったという報告のみで。


ステップ実行できるところまではわりとすぐにいったんだけど、ブレークポイントで止まらない止まらないw。実際ググるとブレークポイントで止まらない系の記事が結構あって、そこを見たけどみんな環境が違うから設定ファイルの書いてあることがかなり違うんですよね。PHPだけじゃなくPythonとかその他の言語でもブレークポイントで止まらないとの話があって、これはVSCodeの共通の問題点なんじゃないかと。


とりあえず環境を書いておきますね。

サーバ:VirtualBox上のCentOS7
webサーバ:Apache
クライアント・ホストOS:Windows10

あとの細かいバージョンやら状況は忘れた。特定のバージョンの記事を書いているつもりはないけど、新しくなったら設定方法とかすぐに変わるからなOSSは。


Xdebugを入れるのはPECLで入れました。仕事だとソースから入れて塩漬けできるようにした方がいいんだけど、面倒なので

sudo pecl install xdebug


で入れました。
peclが入っていないときはyumで入れる。

sudo yum install pecl


なんというか、Ubuntuはわりとsudoでやる文化があるのですが、RedHat系はsuでrootにならないといけないサンプルが多くて、複数行をコマンドをそのまま貼り付けて実行できないんすよね。#マークが行頭にくっついてきて、率直に面倒くさい。Debian系が好きなんだけども、yumがapt並みにはなっているので大体問題ない。


それとよくMacのローカルでMAMPとかでやっているのを見ましたけど、あれはリモートにつないでないので微妙に参考にならなかったりしました。LinuxとMacという違いもあることですし。とはいえ、最大公約数的な設定の重なりは見られたので良かったのかもなと思ったり。

あと先に言ったようにPHPに限らずブレークポイントで止まらないという記事が割とあったので、いろいろな問題だけど基本的な設定で不具合が出ているのかなと感じました。まぁIDEで提供されている機能をいちエディタがやろうとしているのだから無理が来ても仕方がないかも。


Xdebugを入れたので、まずサーバ側(/etc/php.ini)の設定。なんか入れるバージョンによって設定される文字列も違うのかな? なので自分が入れた時のデフォルトの設定は書いておく。ここに一部変更したり、挿入したりしている。

[xDebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable=1
xdebug.remote_handler="dbgp"
xdebug.remote_host="127.0.0.1"
xdebug.remote_log="/tmp/xdebug.log"
xdebug.remote_port=9000
xdebug.trace_output_dir="/tmp/"


いろいろあるんだけど、恐らくミニマムな設定は元々あった行に、次の行を加えれば良いらしかった。多分、最低下の行を加えないとうんともすんとも言わなかった気がする。
xdebug.remote_autostart=1


ただ、いろいろなところで書かれていた設定がかなり違っていたので、他のものも保険に書いておく。
多分、元々書いてあったけど必要そうな設定の一つは
xdebug.remote_enable=1


それとデフォルトで指定している9000番ポートが使えないことが多いらしいので、VSCodeと同じように変える。たぶんここは予約されていないポートであれば、どちらも同じものに合わせればいいんじゃないかな。
xdebug.remote_port=9001


多分、9000番でも動くんだけど、何かと競合することがあるらしく、エラーが出て動かなくなることがある。OSを再起動してすぐに使い始めると、競合することなく使えるんだけど、そのためにリブートするのもバカらしいので9000番から変えておいた方が賢い選択かもしれない。


/etc/php.d/ に設定ファイルを入れないといけないとか思ってしまうが、/etc/php.ini に設定するのも同じようなので面倒なことはしない。というか、設定が重複してどちらかに要らない設定が残ってしまいがちなのでどちらかに決めて一元化したほうがいいような気がする。





そしてわりと鬼門となるVSCodeの設定ですが、これは特に環境によって違うみたいです。つなぎ先の違いもあるし、VSCodeを入れるOSもWindowsとMacがありますしね。とりあえずPHP DebugとRemote DevelopmentのExtensionを入れて、つなぐところの手順はほかのところで見てもらうとして(手抜きw)、設定ファイルの書き方ですね。

というかSSHでつないでやるところとかは、初回と次回からのやり方が違うし、ある程度試行錯誤でやってもらわないとどうやってやるか結局迷うし。とりあえずコマンドパレットの使い方を慣れないといけない感じです。

https://qiita.com/bitcoinjpnnet/items/dc94c79bd6a69925872d

とりあえずSSHでつないでデバッグするための、launch.jsonの設定を設定します。というか、SSHのおエペレーション以外はほとんどExtensionのインストールと設定ファイルの書き方でなんとかなるレベルではあります。

左側のデバッグボタンを押して、歯車ボタンを押すと、設定のためのlaunch.jsonが出てきます。

vscode.png

具体的な設定は下記のようにしました。

{
  "version": "0.2.0",
  "configurations": [
      {
          "name": Listen for XDebug
          "type": "php",
          "request": "launch",
          "port": 9001,
          "stopOnEntry": true,
          "pathMappings": {
              "${workspaceRoot}" : "${workspaceRoot}"
          }
    }
}


キモとなっているのはportとstopOnEntryとpathMappingsの設定ですね。portはXdebug側と同じにすれば良くて、stopOnEntryはデバッグが始まったら先頭行で止まるようになります。そこまでは普通にできて、ステップ実行などはできます。

でも、ブレークポイントで止まらない。ググってもブレークポイントで止まらない例はたくさんあって、そこまではみんなうまく行くっぽいですね。色々他の設定をしたけど全然びくともしなくて、結局

"pathMappings"を
"${workspaceRoot}" : "${workspaceRoot}"

に設定すれば動くようになりました。正直、細かい事はわからないんですが、ここは実際のパスを設定しないといけないところなので、リモートだとこういう設定にしないといけないみたいです。ここは正しく設定しないとブレークポイントが効かないので注意しましょう。

ステップ実行ができるところまでは簡単に行くんですけど、ブレークポイントの設定はここだけっぽいので環境によって設定しないといけないみたいです。Webにある多くの環境がリモートじゃなく、ローカルであったりすることが多いので、そこはきちんと読み替えないとダメみたいです。とりあえず、SSHで他のところに繋ぐ場合はこの設定を試してみてください。少なくともデフォルトの状態では動きません。


そんなこんなでブレークポイントで止まらないところだけで困っている方は、pathMappingsをいじってみてください。他のところは他の人がやり倒しているので、ここに書いてあることをやれば大体ミニマムな設定でできていると思いますよ。まぁ無駄なことが書いてあっても大体は無害なので大丈夫なはず。

他の言語から入ってきて、PHPはステップ実行もブレークも張れないと残念に思っていましたが、やろうと思えばやれることはあるんですね。それもタダでできるのだから自己で勉強する点においては問題がない。

タグ:PHP
コメント(1) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2020/01/24 [Twitter]


コメント(0)