首页 > 解决方案 > 如何设置 VSCode、PHP 调试和 XDebug (Windows 10)

问题描述

我想使用 VSCode 的“PHP Debug”插件和 Xdebug 来调试 PHP 脚本。

但是当我选择“调试|开始调试 F5”时,会出现小调试弹出窗口,我被卡住了。暂停、重新启动、停止按钮处于活动状态。Step over, into, out 按钮处于非活动状态(灰显)。调试控制台中没有任何反应。

(1) 安装VSCode 1.42.1

(2) XAMPP v3.2.4 启动并运行

(3) 使用向导安装 Xdebug 并粘贴我的 phpinfo() 数据以确定正确的版本。当我从 XAMPP 控制面板启动 'admin' 并查看 phpinfo 时,浏览器会显示我(以及许多其他内容):

[...]
This program makes use of the Zend Scripting Language Engine: 
  Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
[...]

(4)php.ini

[XDEBUG]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.show_local_vars = 1
xdebug.remote_log = "C:\Program Files_\xampp\php\logs\xdebug.log"
zend_extension = "php_xdebug-2.9.2-7.4-vc15-x86_64.dll"

(请注意“Program Files_”不是受保护的“Program Files”目录,XAMPP 具有写访问权限,如下面的第(9)点所示)

(5) Windows 路径C:\Program Files_\xampp\php;中有

(6) 当我在 VSCode 中使用 Code Runner 扩展运行“Hello World.php”脚本时运行良好

(7)launch.json对于 VSCode 调试器有

"configurations": [

    {
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "port": 9000
    },
    {
        "name": "Launch currently open script",
        "type": "php",
        "request": "launch",
        "program": "${file}",
        "cwd": "${fileDirname}",
        "port": 9000,
    }
] 

(8) 我的 Windows 防火墙有一个入站规则,允许端口 9000 上的 TCP 流量。

(9) 当我刚刚运行代码时,xdebug.log(请参阅php.ini)更新为

[94396] Log opened at 2020-03-08 07:45:28
[94396] I: Connecting to configured address/port: localhost:9000.
[94396] E: Time-out connecting to client (Waited: 200 ms). :-(
[94396] Log closed at 2020-03-08 07:45:28

但是当我使用“调试|开始调试 F5”时,xdebug.log 中没有任何反应。

到目前为止,这就是我认为相关的所有信息。这让我像这样:

me -> update_status("at wit's end")

你们那里的巫师知道在哪里挖吗?要调整哪个配置文件?要查阅哪个日志文件?

脚注:在 VSCode 中调试 Python 脚本的工作与预期一样。

标签: phpvisual-studio-codexamppxdebug

解决方案


@LazyOne 的评论提供了偶然发现解决方案的线索和工具......

事实证明,答案相当尴尬。

长话短说(如何检查 VSCode 是否正在侦听端口 9000)

  1. 启动 XAMPP,启动 VSCode
  2. 打开你的 php 脚本
  3. 设置断点
  4. 打开一个 Linux shell(我在 Windows 上的 Ubuntu 上使用 Bash)
  5. 在shell中运行telnet 0.0.0.0 9000telnet localhost 9000观察连接失败
root ~ $ telnet localhost 9000 
Trying 127.0.0.1... 
telnet: Unable to connect to remote host: Connection refused 
root ~ $ telnet 0.0.0.0 9000
Trying 0.0.0.0... 
telnet: Unable to connect to remote host: Connection refused
  1. 开始调试并看到如上所述的冻结调试弹出窗口
  2. 运行telnet 0.0.0.0 9000telnet localhost 9000在 shell 中运行并注意区别:您已连接到 VScode!
root ~ $ telnet 0.0.0.0 9000 
Trying 0.0.0.0... 
Connected to 0.0.0.0.
Escape character is '^]'.
  1. 单击冻结的调试弹出窗口上的停止按钮并在外壳中观察
stop -i 1 Connection closed by foreign host.
root ~ $ 

得出结论,VSCode 确实在监听 0.0.0.0:9000 和 localhost:9000。

  1. 挠头,回到 VSCode
  2. 开始调试
  3. 注意底部的橙色状态栏,上面写着“Listen to XDebug”
  4. 注意菜单栏下方的下拉菜单,上面写着“绿色箭头”和“监听 XDebug”
  5. 探索下拉菜单并(重新)发现第二个配置“启动当前打开的脚本”,意识到/记住您launch.json有 2 个配置
  6. 选择“启动当前打开的脚本”时单击绿色箭头,看到沿着“listen EARDRINUSE: address already in use :::9000”行弹出错误
  7. 取消错误提示,点击调试弹窗的停止按钮停止调试,注意底部菜单栏变为蓝色
  8. 当下拉菜单中再次显示“启动当前打开的脚本”时单击绿色箭头...并注意调试按预期开始
  9. 麾!赞扬@LazyOne 的帮助!感谢上天赐予 stackoverflow 社区!
  10. “Listen for XDebug”配置launch.json用于调试从浏览器会话启动的脚本:(i)在 VSCode 中设置断点,(ii)使用“Listen for XDebug”配置开始调试,(iii)启动脚本通过在浏览器中发起请求,(iv) 观察 VSCode 是否在处理请求时触发断点

短篇故事

当您开始在 VSCode 中调试 php 脚本时,请确保选择“启动当前打开的脚本”作为配置,请参见下面的屏幕截图。 只是为了确保您知道我在说哪个下拉菜单

事后诸葛亮

我已经改变launch.json

"configurations": [
    {
        "name": "Launch currently open script",
        "type": "php",
        "request": "launch",
        "program": "${file}",
        "cwd": "${fileDirname}",
        "port": 9000
    },
    {
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "port": 9000
    }
]

这样,“启动当前打开的脚本”是默认设置,当我使用主菜单中的“调试|开始调试 F5”开始调试时将使用该脚本。


推荐阅读