michihide's blog

技術メモおよび雑感

NetBeansでリモートデバッグできなくなった

最近はCakePHPで開発をしていますが、フレームワークIDEなしで開発するのは(少なくとも自分には)非現実的だと悟ったので、デバッグはもっぱら Xdebug+NetBeansによるCakePHPのデバッグ の手順に従ってNetBeansを使っています。

今日 NetBeans を使ったら、ふとしたことからリモートデバッグが動かなくなったので、原因を調査した時のメモです。

最初の症状としては、デバッグ開始後サーバからの応答待ちのまま先に進まない(ソースの開始行まで到達しない)が、IDE単体としては問題なく動いている、という感じです。

サーバ側で Xdebug の設定は以下のようにしています。Xdebug はポート 9000 を使っています。

$ grep ^xdebug /etc/php.ini
xdebug.remote_connect_back = on
xdebug.remote_port    = 9000
xdebug.remote_handler = dbgp
xdebug.remote_enable = On
xdebug.remote_log = /tmp/xdebug_remote.log
xdebug.idekey = netbeans-xdebug

端末(Windows)側でネットワークの状態を確認します。ちなみにすっかり忘れてましたが、以前 Windowsgow を入れていたようで grep 等が使えるようになっていました。

gow - Unix command line utilities installer for Windows.

W:\>which grep
C:\Program Files (x86)\Gow\bin\grep.EXE
W:\>netstat -an | grep -w 9000
  TCP    10.28.1.53:9000           10.30.8.31:54321           CLOSE_WAIT

10.28.1.53 が開発機(Windows7 Pro)、10.30.8.31 がサーバ(CentOS7)です。

デバッグを中止してからしばらく待っても CLOSE-WAIT のまま。これは端末側のネットワークの内部状態がおかしくなっていると判断し、パソコンをリブートしたらこの状態は解消されました。

ただ、ブレークポイントで止まらないのは相変わらず。

今度はサーバ側で tcpdump を仕掛けてからデバッグを開始し、パケットを監視してみました。

root@germany:~# tcpdump -n -nn port 9000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:07:54.998420 IP 10.30.8.11.36562 > 10.28.1.53.9000: Flags [S], seq 2531464156, win 14600, options [mss 1460,sackOK,TS val 1533355514 ecr 0,nop,wscale 7], length 0
11:07:55.238767 IP 10.30.8.11.36563 > 10.28.1.53.9000: Flags [S], seq 4273096071, win 14600, options [mss 1460,sackOK,TS val 1533355754 ecr 0,nop,wscale 7], length 0

サーバから端末に対して ポート 9000 への接続を張りに来ていますが、相変わらず端末がそれを無視しています。

W:\>netstat -an | grep -w 9000
  TCP    0.0.0.0:9000           0.0.0.0:0              LISTENING
  TCP    [::]:9000              [::]:0                 LISTENING

端末側ではポートの待ち受けはしているようですが、まったくパケットを受けていない状態。 これは Windows 側のファイアーウォールが疑われるので、設定を見てみます。 まず、動いているプロセスのパスを調べます。

20150528105011

netbeans64.exe で右クリックしてプロパティを開きます。

20150528105012

フルパスは C:\Program Files\NetBeans 8.0\bin\netbeans64.exe ということがわかります。次は コントロール パネル>システムとセキュリティ>Windows ファイアウォール>詳細設定>受信の規則 を開きます。

20150528130922

実はここを開いた直後は、NetBeans の過去のバージョンに対するルールがたくさんゴミとして残っていました。気持ちが悪いので、旧バージョンの分はすべて削除しました。プログラムのアンインストールをしても、ルールは自動では消えてくれないんでしょうかね?

これによると、現在の状態は「ドメイン」は許可、「パブリック」はブロックになっています。 これは Windows(NT/AD) ドメインではなくネットワークプロファイルの用語のようです。 画面右下のアイコンにマウスを乗せると、現在の状態が表示されます。

20150528130448

この表示は「識別されていないネットワーク」につながってると言いたいのか、 それとも「アクセスできるネットワークがない」と言いたいのか…。

というか、そもそもルールが二重に登録されている時点でおかしい。

ということで、二重になっている部分を「ドメイン」と「パブリック」がそれぞれ1行だけになるようにしました。

20150528131732

ここまでシンプルにして、再度挑戦します。

どう見ても「パブリック」がブロックになっていることが原因のように思えます。 と思いきや、「パブリック」を許可しても、状況は変わりませんでした。

ファイアーウォールルールのエントリに不整合が出ているようなので、 いったん「NetBeans」のルールをすべて削除した後、 再度デバッグを開始したら、以下のダイアログが表示されました。

20150529113752

これで再度「アクセスを許可」してやったらうまくいくようになりました。めでたしめでたし。