Xdebug успешно подключается к клиентам DBGP, но не останавливается на точках останова

У меня установлен Xdebug 2.1 и работает с PHP 5.2.13. Он может успешно подключаться к нескольким клиентам DBGP (т.е. xdebug.remote_log показывает связь назад и вперед, и сами клиенты также показывают входящее соединение), но это не останавливается в точках останова. Я пробовал NetBeans, MacGDBp, а также командную строку debugclient в комплекте с Xdebug.

Типичный обмен выглядит так:

Log opened at 2010-07-20 09:33:17
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///mnt/hgfs/htdocs/mycompany/index.php" language="PHP" protocol_version="1.0" appid="14371" idekey="macgdbp"><engine version="2.1.0"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2010 by Derick Rethans]]></copyright></init>

<- status -i macgdbp
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="status" transaction_id="macgdbp" status="starting" reason="ok"></response>

<- step_into -i macgdbp
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="step_into" transaction_id="macgdbp" status="stopping" reason="ok"></response>

<- status -i macgdbp
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="status" transaction_id="macgdbp" status="stopping" reason="ok"></response>

Log closed at 2010-07-20 09:33:18

NetBeans пытается установить точки останова, и они подтверждаются Xdebug:

<- breakpoint_set -i 7 -t line -s enabled -f file:///mnt/hgfs/htdocs/mycompany/index.php -n 9
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="7" state="enabled" id="139360004"></response>

Тем не менее, Xdebug по-прежнему отказывается останавливаться!

5 ответов

Решение

Это происходит, если Xdebug загружен как extension (т.е. extension=xdebug.so) в конфигурации PHP вместо zend_extension (т.е. zend_extension=/usr/lib/php5/20060613+lfs/xdebug.so).

Убедитесь, что у вас нет extension=xdebug.so в любом месте вашей конфигурации PHP, даже если вы уверены, что используете zend_extension, Например, если у вас есть zend_extension в /etc/php5/conf.d/xdebug.ini, это вполне может быть заменено extension в /etc/php5/apache2/php.ini, Если это так, ничто не будет жаловаться, и phpinfo() покорно сообщит, что Xdebug загружен! (Xdebug 2.1 выдает небольшое предупреждение в phpinfo() при загрузке в качестве расширения, но предыдущие версии ничего не делают.)

У меня была эта проблема с контейнером Docker в Windows. Все выглядело правильно настроенным, phpStorm правильно прослушивал локальный порт 9000 на 127.0.0.1. phpinfo() отобразил запущенный xdebug.so. Когда я запускаю сценарий из веб-браузера, отладчик не может остановиться на точке останова. Xdebug.log содержал это:

Log opened at 2019-07-02 08:17:10
I: Connecting to configured address/port: docker.for.mac.localhost:9000.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///app/www/index.php" language="PHP" xdebug:language_version="7.2.15" protocol_version="1.0" appid="38768" idekey="PHPSTORM"><engine version="2.6.1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2018 by Derick Rethans]]></copyright></init>

-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>

Log closed at 2019-07-02 08:17:10 

Мне пришлось подключиться к контейнеру по ssh, чтобы узнать, что он не подключается из контейнера к Windows, в которой размещен контейнер. Проблема заключалась в том, что моя конфигурация компоновки докеров содержалаdocker.for.mac.localhost который собирался ввести в xdebug.remote_hostнастройка. Даже если xdebug.log утверждал, что xdebug подключен к клиенту, на самом деле он не подключался.

Решение было xdebug.remote_host = host.docker.internal. Это имя хоста используется в контейнере Docker для локального подключения к операционной системе, в которой размещен контейнер.

Подробнее здесь: https://docs.docker.com/docker-for-mac/networking/

Если файлы php помещены в папку symlink, XDebug будет работать с путем к исходной папке, а не путем к папке symlink!

Таким образом, чтобы включить точки останова, вы должны настроить сопоставления путей в вашем ide для символических папок и файлов

Я знаю, что на этот вопрос уже дан ответ, но я столкнулся с той же проблемой, просто хочу предложить свой ответ, если кто-то еще столкнется с этим. Я случайно пропустил значение case в моих путях, которое все еще позволяло мне подключиться и запустить отладчик, но оно не остановилось на моих точках останова. Я не осознавал этого до особого разочарования, поэтому я просто хочу, чтобы люди знали, что это тоже возможно.

В моем случае Eclipse не может получить отладочную информацию, поэтому включите журнал xdebug и проверьте ответ, возвращенный <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response> без дополнительной информации.

Исправить это изменить конфигурацию отладки

xdebug.remote_host=127.0.0.1 to
xdebug.remote_host=localhost

в /usr/local/etc/php/5.6/php.ini

затем перезапустите Apache.

Надеюсь это поможет

Вы должны добавить полный путь к xdebug.so файл, даже если он находится в php/modules/ папка, как zend_extension не выглядит в этой папке по умолчанию.

Если у вас есть exension=xdebug.so line, xdebug загрузится, но не остановится на точках останова (лучше меня).

Удаление всех exension=xdeabug.so (даже из файла Cli INI, который также загружается) и добавление zend_extension решит вопрос.

Другие вопросы по тегам