29

前文

多くの人と同じように、私は XDebug を使用してプログラムをデバッグするよりも、IDE から XDebug への接続をデバッグすることに多くの時間を費やしてきました。繰り返し動作するようになりましたが、時々、「接続待ち」という一般的な問題が発生します。XDebug が動作または失敗する原因を特定できませんでした。私は2年間ubuntuを使用しています。私は初心者でも strace グルでもありません。私は何を間違っていますか?IDE の XDebug への接続をより適切にデバッグするにはどうすればよいですか?


設定

  • Ubuntu 10.10
  • NetBeans 6.9.1
  • PHP 5.3.3-1ubuntu9 と Suhosin-Patch
  • xdebug.org のカスタマイズされたインストール手順スクリプトを使用して、2010 年 9 月 20 日にソースからビルドされた debugclient を含む Xdebug v2.1.0
  • アパッチ アパッチ/2.2.16
  • /etc/php5/apache2/php.ini と /etc/php5/cli/php.ini の両方があります:
    • zend_extension = /usr/lib/php5/20090626+lfs/xdebug.so
      xdebug.remote_enable=1
      xdebug.remote_handler=dbgp
      xdebug.remote_mode=req
      xdebug.remote_host=127.0.0.1
      xdebug.remote_port=9000
      xdebug.remote_log=/var/log/xdebug.log
      xdebug.extended_info=1
      xdebug.idekey="netbeans-xdebug"
      

手順

問題

問題の原因や問題がいつ発生するかを説明できません。これは、プロジェクトをデバッグしようとしたときに始まります。これにより、選択した開発ブラウザー (Chrome) が、パラメーターを使用してプロジェクトの URL を開きますXDEBUG_SESSION_START=netbeans-xdebug。これにより、ページはクロムで正常にレンダリングされますが、Netbeans は「接続待ち」のみを報告します。

XDebug のデバッグ

まず、「Waiting to Connect」メッセージがまだ有効な状態で、netstat を使用してポート 9000 を調べてみます。これは次のようになります。

$ netstat -an | grep 9000
tcp6       0      0 :::9000                 :::*                    LISTEN     

IDE をシャットダウンし、何が起こっているのかを把握するために 2 つのファイルを使用しよう{webroot}/index.php<?php phpinfo(); ?>まし{webroot}/dbgtest.phpた。

<?php
$address = '127.0.0.1';
$port = 9000;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die('Unable to bind');
socket_listen($sock);
$client = socket_accept($sock);
echo "connection established: $client";
socket_close($client);
socket_close($sock);
?>

XDebug を起動してdebugclient開くと、通常は通常の出力http://127.0.0.1/dbgtest.php?XDEBUG_SESSION_START=mysessionが得られ、XDebug が別のターミナルで netstat を使用してスクリプトに接続されていることを確認します。

$ netstat -an | grep 9000
tcp        0      0 127.0.0.1:9000          127.0.0.1:34831         ESTABLISHED
tcp        0      0 127.0.0.1:34831         127.0.0.1:9000          ESTABLISHED

これらはどちらも接続が確立されたことを示しているように見えますが、Web ページには「バインドできません」と表示されますが、これについては説明できません。Ctrl-c を押して debugclient を終了すると、この時点で netstat がポート 9000 にアクティビティがないことを確認します。Netbeans を起動し{webroot}/index.php、デバッガーを開いて起動しhttp://127.0.0.1/index.phpます。通常、デバッガは正常に起動します。デバッガーを停止し、プロジェクトに戻ると、ここで問題が本当に厄介になります。通常どおりプロジェクトのデバッグを続行できる場合もあれば、問題が再発し、「待機中」の場合もあります。 Connect」サインが表示され、netstat が表示されます。

$ netstat -an | grep 9000
tcp6       0      0 :::9000                 :::*                    LISTEN     
tcp6       0      0 127.0.0.1:9000          127.0.0.1:34681         TIME_WAIT 

また、コンピューターを再起動し、ターミナルを起動して、次のことを見つけます。

$ netstat -an | grep 9000
unix  3      [ ]         STREAM     CONNECTED     9000  
$ telnet 127.0.0.1 9000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

私はネットワークと Linux の内部構造に詳しくなく、これが何を指しているのかを理解できません。明らかに何かがポート 9000 を使用しています。これはどういう意味ですか? php.ini での設定にもかかわらず、次の点に注意してください。

$ cat /var/log/xdebug.log
cat: /var/log/xdebug.log: No such file or directory

IDE と XDebug 間の接続をデバッグする正しい方法は何ですか?

4

3 に答える 3

5

たまたまCiscoVPNクライアントを使用している場合は、これが原因である可能性があります。クライアントが起動していなくても常にオンになっているファイアウォールが付属しています。[オプション]メニューでオフにすることができます。

于 2011-02-04T10:19:26.383 に答える
4

このスレッドを読んでください。

http://forums.netbeans.org/post-99369.html

最終的に回避策は、net.ipv6.bindv6only=0をファイル/etc/sysctl.d/bindv6only.confに追加してから再起動することでした。その後、Xdebugは正常に機能しました。

于 2012-03-27T02:43:04.160 に答える
2

さて、私の開発設定はあなたのものとは多少異なりますが、私はこの問題をよく知っています. 実際、私はそれを解決しました...今回はFireeallが、XDebugがIDEと通信するために使用するポートをブロックしました。

あなたのアカウントを読んでいると、いくつかのことが頭に浮かびます。

1) 「問題の原因や問題がいつ発生するか説明できません。」これは非常に重要な声明です。ご存知のように、技術的な解決策は、根本的な問題が常に発生するか、時にはランダムに発生するかに厳密に依存しています。では、この方法で XDebugging を実行することはできますか?

2) IDE が待機中で、ブラウザーがサイトをすぐにレンダリングする場合、IDE に何か問題があり、XDebug サーバーを開始するように指示していると思います。B/c XDebug が起動し、XDebug クライアントに接続できなかった場合、Web サイトはすぐにレンダリングされません。しかし、あなたの場合、GETパラメータは単に無視されます。開始したいXDebugセッションについて何も知らないため、Apache/PHPサーバーにとっては意味がありません。

3) あなたのソリューション アプローチは、私には非常に複雑に思えます。最初はできるだけシンプルにして、それがどのように機能するかを見ていきます。たとえば、"xdebug.idekey="netbeans-xdebug" は通常、最初のセットアップには必要ありません。

それらは私の2セントです

ベストラファエル

于 2011-01-29T13:36:31.967 に答える