如何设置 VSCode、PHP Debug 和 XDebug (Windows 10)

How to set up VSCode, PHP Debug and XDebug (Windows 10)

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

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

(1) VSCode 1.42.1 已安装

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

(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

但是当我使用 "Debug|Start Debugging F5" 时 xdebug.log 没有任何反应。

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

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

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

脚注:VSCode 中 Python 脚本的调试工作如预期。

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

结果答案很尴尬。

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

  1. 开始XAMPP,开始VSCode
  2. 打开你的 php 脚本
  3. 设置断点
  4. 打开一个Linuxshell(我在Windows上Ubuntu上用了Bash)
  5. 运行 telnet 0.0.0.0 9000telnet localhost 9000 在 shell 并观察连接失败
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. 单击冻结调试弹出窗口上的停止按钮并在 shell
  2. 中观察
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. 探索下拉菜单并(重新)发现第二个配置“启动当前打开的脚本”,realize/remember您的 launch.json 有 2 个配置
  6. 选择“启动当前打开的脚本”时单击绿色箭头,会看到一条错误消息“listen EARDRINUSE: address already in use :::9000”
  7. 取消错误信息,点击调试弹窗的停止按钮停止调试,注意底部的菜单栏变成蓝色
  8. 当“启动当前打开的脚本”再次显示在下拉列表中时单击绿色箭头...然后注意调试按预期开始
  9. 高兴!赞扬@LazyOne 的帮助!感谢天赐的 Whosebug 社区!
  10. launch.json 中的“侦听 XDebug”配置用于调试从浏览器会话启动的脚本:(i) 在 VSCode 中设置断点,(ii) 开始调试使用“侦听 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”开始调试时将使用它。

launch.json(默认配置):

{
"version": "0.2.0",
"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,
    }

]}

在 php.ini 中包含指令 xdebug.idkey=VSCODE 是绝对必要的,即使我没有在文档中找到任何对它的引用。

[xDebug]
zend_extension="c:\xampp\php\ext\php_xdebug-2.9.8-7.3-vc15-x86_64.dll"
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.idekey=VSCODE

我刚刚 运行 解决了这个问题,当时我试图听 XDebug,但当我尝试按 F5 或 Run/Debug 时 没有任何反应。 ..

原来我的工作区中添加了一些幻影文件夹(我已经运行使用一些升级工具对我正在处理的应用程序进行了一系列测试,所以我想这就是那个地方来自?)。

从工作区中删除那个“额外”文件夹是我需要做的,以便能够再次“运行”调试过程。希望这可以帮助遇到类似问题的其他人(不像我那样愚蠢)。