Отладка подключения порта IDE к XDebug: «Ожидание подключения» - PullRequest
29 голосов
/ 18 октября 2010

Преамбула

Как и многие, я потратил больше часов на отладку соединения моей IDE с XDebug, чем с использованием XDebug для отладки своих программ. Я заставляю его работать многократно , но время от времени у меня возникает общая проблема "Ожидание соединения" . Я не смог локализовать то, что заставляет XDebug работать или не работать. Я использую Ubuntu в течение двух лет; Я не нуб и не сторонний гуру. Что я делаю не так? Как мне лучше отладить соединение моей IDE с XDebug?


Настройка

  • Ubuntu 10.10
  • Netbeans 6.9.1
  • PHP 5.3.3-1ubuntu9 с Suhosin-Patch
  • Xdebug v2.1.0 с debugclient, собранным 20 сентября 2010 г. из исходного кода с использованием специального скрипта инструкций по установке на xdebug.org
  • Apache Apache / 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. Это заставляет страницу нормально отображаться в Chrome, в то время как Netbeans сообщает только «Ожидание подключения».

Отладка XDebug

Во-первых, с сообщением «Ожидание соединения» все еще жив, я попытаюсь использовать netstat для поиска порта 9000, который выглядит как что-то вроде this:

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

Я закрыл свою IDE и попытался использовать два файла, чтобы выяснить, что происходит: {webroot}/index.php содержит <?php phpinfo(); ?>, а {webroot}/dbgtest.php содержит скрипт проверки установки XDebug :

<?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

Хотя оба они, похоже, указывают на то, что соединение установлено, на веб-странице написано «Невозможно связать», что я не могу объяснить. Я Ctrl-c, чтобы выйти из debugclient, и netstat в этот момент проверяет, что порт 9000 не имеет активности. Я запускаю Netbeans, открываю {webroot}/index.php и включаю отладчик, который открывает http://127.0.0.1/index.php. Отладчик тогда обычно запускается нормально. Я останавливаю отладчик, возвращаюсь к своему проекту, и именно здесь проблема действительно становится раздражающей: иногда я могу продолжать отладку своего проекта в обычном режиме, а в других случаях проблема возникает снова, и пока «Ожидание Отображается значок подключения, 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?

Ответы [ 3 ]

5 голосов
/ 04 февраля 2011

Если вы случайно используете клиент Cisco VPN, это может быть причиной. Он поставляется с брандмауэром, который всегда включен, даже если клиент не запущен. Его можно снять в меню «Параметры».

4 голосов
/ 27 марта 2012

Пожалуйста, прочитайте эту тему.

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

В конце концов, обходной путь должен был добавить net.ipv6.bindv6only = 0 в файл /etc/sysctl.d/bindv6only.conf и затем перезагрузиться.Xdebug работал нормально после этого.

2 голосов
/ 29 января 2011

Ну, мои настройки разработки несколько отличаются от ваших, но я очень хорошо знаю эту проблему.Фактически, я только что решил это ... на этот раз мой Fireeall заблокировал порт, который XDebug использует для общения с моей IDE.

При чтении вашей учетной записи приходят на ум некоторые вещи:

1) "Я не могу объяснить, что вызывает проблему или , когда проблема проявляется . "Это очень важное утверждение, потому что, как мы все знаем, технические решения строго зависят от того, является ли основная проблема всегда или иногда, казалось бы, случайной.Итак ... можете ли вы иногда выполнять XDebugging таким образом или никогда?

2) Когда ваша IDE ждет, и ваш браузер немедленно отображает сайт, тогда я думаю, что-то не так с вашей IDE, сообщающей вашему XDebug-серверуначать.B / c, если XDebug запустится и не сможет подключиться обратно к вашему XDebug-клиенту, то веб-сайт не будет отображаться немедленно.Но в вашем случае GET-параметры просто игнорируются, потому что они не имеют никакого значения для вашего Apache / PHP-сервера, так как они ничего не знают о какой-то XDebug-сессии, которую вы хотели бы запустить.

3) Ваши подходы к решению кажутся мне очень сложными.Сначала я хотел бы придерживаться максимально простого и посмотреть, как это работает.Например, "xdebug.idekey =" netbeans-xdebug "обычно не обязателен для первой установки.

Это мои два цента

Лучший Раффаэль

...