Xdebug:[Step Debug] 无法连接到调试客户端

49

我想尝试Xdebug 3.0.0RC1,探索其中的变化和新功能。我还使用最新的PhpStorm 2020.3 EAP,它支持Xdebug 3而无需进行任何重要配置。下面是我的PhpStorm调试器配置:

enter image description here

这是我尝试的Xdebug3配置:

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal # here I tried several combinations like: "localhost", "127.0.0.1", "172.17.0.1"
xdebug.client_port=9001 # here I tried several ports 9003 included with no success

我也尝试不添加client_host/client_port设置,但仍然失败。

我收到了这个错误:

Script php bin/console doctrine:cache:clear-metadata returned with error code 255
!!  [17-Nov-2020 15:24:40 UTC] Xdebug: [Step Debug] Could not connect to debugging client. Tried: host.docker.internal:9001 (through xdebug.client_host/xdebug.client_port) :-(
!!  [17-Nov-2020 15:24:41 UTC] PHP Fatal error:  Method class@anonymous::__toString() must not throw an exception, caught Symfony\Component\DependencyInjection\Exception\AutowiringFailedException:  in /var/www/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php on line 233

关于我的环境的一些信息:

  • Fedora 33
  • Docker 版本为 19.03.13,构建版本为 4484c46d9d
  • PhpStorm 2020.3 EAP 版本 #PS-203.5784.36

很奇怪(因为显然我使用的 Docker 版本不支持 host.docker.internal,但它还是可以正常工作),而且以下配置即使调试器始终侦听传入连接,也可以在 Xdebug 2 中正常工作:

输入图像描述

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.remote_autostart=0
xdebug.remote_enable=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9000

我在这里缺少什么?

注意:我已经按照Xdebug开发人员在这里提供的解决方案进行了应用。


1
你的操作系统是什么? - LazyOne
2
host.docker.internal 不支持 Linux 系统,仅支持 Windows 和 Mac 系统 -- https://github.com/docker/for-linux/issues/264 。自 Docker v20 版本开始将支持该主机名 -- https://github.com/docker/for-linux/issues/264#issuecomment-714253414 。如果您想使用该主机名,您需要动态检测 IP 地址(上述链接提供了许多实现方法)。 - LazyOne
1
@ReynierPM,你也可以使用其他选项(例如xdebug.remote_connect_back = 1——Xdebug 2相当于Xdebug 3中的xdebug.discover_client_host = true)。使用显式IP地址(硬编码)...或者动态检测它。 - LazyOne
3
刚刚熬了整晚才完成这个工作。结果发现ufw被启用并且阻止了端口。ufw allow 9003解决了这个问题,但最好还是按IP/设备进行锁定。 - Farkie
1
@scandel,干得好!我回来回答了! - Farkie
显示剩余18条评论
14个回答

51

PHP 7.4
Docker
PHPStorm 2020.1
Xdebug 3.1.0

使用Dockerfile在您的Docker容器中安装Xdebug

RUN pecl install xdebug-3.0.1 && docker-php-ext-enable xdebug

请按照以下步骤配置php.ini:

[xdebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = 1

打开 PHPStorm - 设置 - PHP - 调试 - Xdebug 并将端口设置为 9003(默认情况下)

PHPStorm

就这样(:

如果您只想在需要时启用/禁用调试器:只需安装名为“Xdebug helper”的浏览器扩展程序,选择“调试”,并从 php.ini 中删除“xdebug.start_with_request = yes”即可。

[xdebug]
xdebug.mode = debug
xdebug.discover_client_host = 1

12
我尝试了这个完全相同的配置,但我仍然收到“无法连接调试客户端。尝试:172.19.0.1:9003(来自REMOTE_ADDR HTTP头)”的错误信息。 - Matteo Tassinari
4
添加xdebug.discover_client_host = 1并仔细检查端口是解决方案,谢谢! - Maarten
1
为什么这样修复问题? - Sam

27

对我有效的方法是将 start_with_requestyes 改为 trigger

这对我起作用了:

xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.client_port=9003

编辑: 如评论中所指出的,trigger/9003是默认设置。如果此答案适用于您,则说明某些内容正在覆盖默认设置,并通过明确使用trigger/9003,您可以强制恢复为默认设置。


6
请注意,当xdebug.mode=debug时,xdebug.start_with_request会自动设置为trigger,因此不需要定义。对于Xdebug 3,xdebug.client_port=9003也是默认设置,因此也不需要定义。参考链接:https://xdebug.org/docs/all_settings#start_with_request https://xdebug.org/docs/all_settings#client_port - Mark Shust at M.academy
为什么它能工作? - Khay Leng
@KhayLeng,似乎有些东西正在覆盖默认设置,通过设置 trigger/9003,您可以将设置强制恢复为默认值。我刚刚编辑了我的答案以添加这些信息。 - Daniel Loureiro

13

我创建了一个非常简单的配置,让我能够以最小的努力使用Xdebug与任何PHP版本一起使用 (v2: 5.6-7.1, v3: 7.2-8.x)。我只需要在三个地方配置PhpStormdocker-compose.yml,就可以进行调试。

配置:

gander/dev @ xdebug2.ini:

zend_extension=xdebug.so
; https://2.xdebug.org/docs/all_settings
; ------------------------------------
; Enables Step Debugging
xdebug.remote_enable=1
; ------------------------------------
; Address where IDE listening for incoming debugging connections
xdebug.remote_host=host.docker.internal
; ------------------------------------
; Port where IDE listening for incoming debugging connections
xdebug.remote_port=9003
; ------------------------------------
; Color var_dumps when in CLI
xdebug.cli_color=1
; ------------------------------------

gander/dev @ xdebug3.ini:

zend_extension=xdebug.so
; https://xdebug.org/docs/all_settings
; ------------------------------------
; Enables Step Debugging
xdebug.mode=debug,develop
; ------------------------------------
; Address where IDE listening for incoming debugging connections
xdebug.client_host=host.docker.internal
; ------------------------------------
; Port where IDE listening for incoming debugging connections
xdebug.client_port=9003
; ------------------------------------
; Color var_dumps when in CLI
xdebug.cli_color=1
; ------------------------------------

gander/dev @ docker-compose.yml:

version: '3.7'

services:
#...
  dev74:
    hostname: 'dev-74'
    container_name: 'dev_74'
    image: 'gander/dev:7.4'
    volumes:
      - './app/xdebug3:/www/localhost'
    working_dir: '/www/localhost/public'
    ports:
      - '8074:80'
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      PHP_IDE_CONFIG: "serverName=dev.74"
#...

通过命令行界面运行:

XDEBUG_SESSION=1 XDEBUG_CONFIG=1 php script.php
或者:
docker-compose exec dev74 bash -c 'XDEBUG_SESSION=1 XDEBUG_CONFIG=1 php index.php'

注意事项:

serverName 表示:

PHP_IDE_CONFIG: "serverName=dev.74"

这是 PhpStorm PHP 服务器的名称(如下面的屏幕截图所示)

屏幕截图:

xdebug端口 配置 验证


以下是各种浏览器的扩展列表: 浏览器调试扩展


代码库中的文件已移动:已修复。 - Gander

8

PHP 7.3

Docker(适用于Mac)

PhpStorm 2021.1


您可能不需要通过PECL安装它(构建时间很长,而且对我来说没用)。

我所做的一切就是将php7.3-xdebug添加到我的apt-get install命令中,并正确配置端口映射如下:

在Dockerfile中添加: RUN apt-get install -y php7.3-xdebug

在docker-compose.yml中,我映射了一个extra_host(这对我来说是秘密调味料):

services:
  web:
    extra_hosts:
      - "host.docker.internal:host-gateway"

在 php.ini 文件中:
[xdebug]
xdebug.mode=debug
xdebug.client_host=host.docker.internal

;optionals: (uncomment if you need them)
;xdebug.start_with_request=yes
;xdebug.discover_client_host=1

在PhpStorm中,我刚开始监听端口9003并将服务器映射配置为我的需求。

参考资料:


我认为这里不需要使用 extra_hosts。这个映射可能曾经在某个时候(与 Linux 主机一起)是必要的。你为什么要添加它?你的主机操作系统是什么? - marcguyer
@marcguyer 我使用的是MacOS。 - Ricardo Martins
host.docker.internal DNS 在 macOS 上会自动设置,因此不需要这行代码。 - Mark Shust at M.academy

4

我首先要感谢@LazyOne花费了一些时间帮助我,直到我们成功让它正常工作。这是目前对我有效的配置如下:

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.mode=debug
xdebug.client_port=9005

您还需要在文件 | 设置 | 语言和框架 | PHP | 服务器中更新Xdebug端口,以反映新端口,并启用选项以侦听Xdebug3传入连接。(我相信在PhpStorm 2020.3中默认已启用该选项)

enter image description here

这是后端项目的设置,没有浏览器参与其中。我没有尝试过,但针对这些项目,您可能需要:

xdebug.start_with_request=yes

另外,还需要正确配置 文件 | 设置 | 语言与框架 | PHP | 服务器

注意:我们发现主机已启用IPv6,我将其禁用,并通过 帮助 > 编辑自定义VM选项 添加了以下设置到IDE中:-Djava.net.preferIPv4Stack=true。添加IP4设置到IDE后,我尚未尝试重新启用IPv6并查看Xdebug 3是否仍然工作。


1
那么问题是什么?(除了不同的端口之外)? 我的意思是,它看起来与问题和今天早些时候删除主机时的情况相同,如果我没记错的话。 - Faizan Akram Dar
@FaizanAkramDar 我猜问题确实是主机。我今天尝试的所有方法都是使用它,但最新的尝试是没有使用它,而且它起作用了。我可以恢复IPv6并查看是否会引起任何问题。 - ReynierPM

2
我想指出ini文件中以下配置选项,因为这是解决同样问题的方法。
xdebug.client_host=host.docker.internal

在PhpStorm的文档这里中提到,必须配置xdebug.remote_host=host.docker.internal,这似乎很相似,但实际上并不是。一个小区别是我使用IntelliJ。

2
remote_host 用于 Xdebug 2,而 client_host 用于 Xdebug 3。 - Mark Shust at M.academy

1
如果您已经尝试了以上所有答案,仍然无法连接到XDebug服务器,请尝试为您的Xdebug端口(默认为9003)添加一个新的ALLOW规则,或关闭本地防火墙(不推荐,但可行)。

Ubuntu和Mint防火墙界面是ufw,您可以通过发出以下命令允许端口9003:

sudo ufw allow 9003

使用以下命令验证更改:

sudo ufw status


1
在Linux Mint上运行时,我遇到了同样的问题。在输入allow命令后,我注意到它向防火墙软件GUI添加了一个新规则。现在它可以正常工作了。 - Clockwork

1

对于wsl,您需要强制客户端主机。

只需打开命令提示符:

wsl hostname -I

这将给出IP地址:

C:\Users\rapha>wsl hostname -I 172.23.103.149

然后将其放在您的xdebug.ini中。

xdebug.client_host=172.23.103.149


0

为了消除控制台中显示的错误,请指定Xdebug将用于存储日志的日志路径。类似下面提到的内容。

xdebug.log=/var/www/var/log/xdebug.log

1
我觉得这样做会压制控制台中的消息,但并不能解决问题。 - Sam

0

如果我使用CLI工作,我遇到了同样的问题:

Xdebug: [Step Debug] Could not connect to debugging client. Tried: 127.0.0.1:9003 (fallback through xdebug.client_host/xdebug.client_port) :-(

以下是导致警告消息的配置:

[XDebug]
...
xdebug.mode=develop,debug
xdebug.discover_client_host=1
xdebug.start_with_request = yes
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9003

我正在使用从URL调试的配置,该配置使用FPM,效果很好。

但是,如果我使用CLI,则必须更改配置,特别是xdebug.start_with_request

之前(FPM):

xdebug.start_with_request = yes

之后(CLI):

xdebug.start_with_request = trigger

额外信息,我正在使用Xdebug 3。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接