【问题标题】:Docker and XDebug not reading breakpoints VSCodeDocker 和 XDebug 不读取断点 VSCode
【发布时间】:2017-09-07 16:30:46
【问题描述】:

在过去的 6 个月里,我一直在使用 XDebug 和 PHP 7.0.* 在 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上发的issue可以找到here

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

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

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

我尝试了很多配置,重新安装、重新启动、重建图像/容器,甚至在 freenode 上尝试了 docker 和 xdebug irc 通道,但均未成功。

【问题讨论】:

  • 你有没有可能在 Mac 上?因为 docker for mac(社区版)和 xdebug 存在相当多的问题。我通过每次重新启动执行一个命令来让它工作。
  • 是的,我在 Mac 上

标签: php debugging docker xdebug


【解决方案1】:

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 Storm:

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

【讨论】:

  • 这是我已经尝试过的过程...没有成功...但我今天可能会再试一次
  • 不幸的是,这仍然无法正常工作...我也尝试过使用 chrome 的 xdebug... XDebug 报告连接为已连接但没有断点,如果我设置它甚至不会在启动时中断我的 IDE 或 chromes xdebug 扩展......
  • 我发现了这个问题,这是由于我的 docker-compose.yml 设置...使用在 VirtualBox 上运行的旧版本 docker 我必须打开我的容器端口 9000 以便 xDebug可以使用隧道连接到我的主机......现在与 docker 会导致冲突......所以上面的答案是正确的,但是对于任何 DID 在他们的容器上打开端口 9000 的人来说,它不再需要被打开/转发
  • @joshualawson 酷!随意编辑答案并添加 docker-compose.yml 信息。很高兴你知道了!
  • xdebug.idekey="VSCODE" 对我来说也很好
【解决方案2】:

检查你的 docker-compose.yml

我有一个环境变量:

XDEBUG_CONFIG: remote_host=${LAN_IP}

需要改成:

XDEBUG_CONFIG: client_host=${LAN_IP}

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

【讨论】:

    【解决方案3】:

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

    我的 VSCODE 的 launch.json

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

    我使用Dockerfile 和下面的 RUN 来安装 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/

    【讨论】:

      猜你喜欢
      • 2022-06-17
      • 1970-01-01
      • 2021-03-16
      • 2021-12-02
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多