Docker 和 XDebug 未读取断点 VSCode

Docker and XDebug not reading breakpoints VSCode

在过去的 6 个月里,我一直在 PHP 版本 7.0.* 上使用 XDebug,在 MAC 上对 Docker 容器进行远程调试。

我是 运行 旧版本的 docker,它使用 VirtualBox to VM for docker,一切正常。

我最近将 docker 更新到版本 17.03.1,除了 xDebug 的问题外什么都没有。我已经通过他的存储库上的一个问题联系了 vscode-php-debug 的创建者,然后他指出我用 xdebug 和/或 docker.

解决这个问题

我的问题如下:

XDebug 是 运行 并在我的容器上工作,xdebug 日志显示它连接到我的 IDE 但它只是关闭连接,就好像没有断点一样,当我设置了断点时VSCode.

我在vscode-php-debug 上发布的问题可以找到here

其中有我的 xDebug 日志和 VSCode 调试日志的副本...它显示已建立连接但没有命中断点。

我读过一些博客 docker 现在需要创建一个环回 ip 才能连接到 xdebug,我也尝试过但失败了。

我发现在使用调试器这么久之后,在没有调试器的情况下很难进行调试。

我尝试了很多配置,重新安装、重启、重建 images/containers,甚至在 freenode 上尝试了 docker 和 xdebug irc 频道,但都没有成功。

EDIT-2 2018

现在可以更改 remote_host 值以支持所有平台:

xdebug.remote_host = "host.docker.internal"

EDIT-1 2018 不再需要使用 plist 修复。正如本要点中所指出的:https://gist.github.com/chadrien/c90927ec2d160ffea9c4#gistcomment-2398281 您现在可以将 docker 用于 mac 内部 IP。

[xdebug]
xdebug.remote_host = "docker.for.mac.host.internal"
xdebug.default_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 0
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_port = 9000
xdebug.idekey="PHPSTORM"

旧配置

由于您在 mac 上使用 docker,我将发布我的解决方案的工作方式。大部分学分归于 this post on the docker forum.

假设您正确安装了 xdebug,这是我在 php.ini 中的配置。

[xdebug]
xdebug.remote_host=10.254.254.254
xdebug.remote_autostart=1
xdebug.idekey = PHPSTORM
xdebug.default_enable = 0
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.profiler_enable = 1

您可以通过在终端中执行此命令来测试您的配置。 sudo ifconfig en0 alias 10.254.254.254 255.255.255.0

如果有效,您可以将其转换为 plist 文件并将其放在以下位置。 /Library/LaunchDaemons/com.docker.xdebugFix.plist。您将在下面找到我的 plist 文件版本。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.docker.xdebugFix</string>
    <key>ProgramArguments</key>
    <array>
        <string>ifconfig</string>
        <string>en0</string>
        <string>alias</string>
        <string>10.254.254.254</string>
        <string>255.255.255.0</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

注意:plist 仅在 Mac 重启后才有效。


PHPSTORM 配置(2018 年编辑后也需要)

之后,我用这样的调试服务器设置了我的 PHP 风暴:

在那之后我的断点开始工作,如果你使用 chrome 你还需要使用 xdebug 扩展,但我很确定你知道这一点,因为你过去使用过它。

检查你的docker-compose.yml

我有一个环境变量:

XDEBUG_CONFIG: remote_host=${LAN_IP}

需要更改为:

XDEBUG_CONFIG: client_host=${LAN_IP}

其中 LAN_IP 在 .env 文件中定义为您的本地 LAN IP

我正在使用 VSCODE devcontainer 并使用以下配置:

我的 launch.json VSCODE

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        }
    ]
}

我使用 Dockerfile 和下面的 运行 来安装 xdebug:

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

我在 /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

中找到我的 xdebug 配置文件

我编辑文件如下:

zend_extension=xdebug

[xdebug]
xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.start_with_request=yes
xdebug.idekey=VSCODE

或者您可以将其添加到 Dockfile 中,如下所示:

RUN echo ' \n[xdebug] \n\
xdebug.client_host=host.docker.internal  \n\
xdebug.mode=debug  \n\
xdebug.start_with_request=yes \n\
xdebug.idekey="VSCODE"  \n\
\n' >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

mode 此设置控制启用哪些 Xdebug 功能。我们已设置 develop 以启用开发辅助工具,例如获得更好的错误消息,并设置 debug 以启用步骤调试。

client_host 此设置告诉 Xdebug 运行 您的文本编辑器或 IDE.

机器的 IP 地址或主机名

start_with_request 此设置确定是否在 PHP 请求开始时激活函数跟踪、垃圾收集统计信息、分析或步骤调试。将其设置为 yes 指示 Xdebug 始终启动调试会话。

参考。 https://matthewsetter.com/setup-step-debugging-php-xdebug3-docker/