【问题标题】:How to set up VSCode, PHP Debug and XDebug (Windows 10)如何设置 VSCode、PHP 调试和 XDebug (Windows 10)
【发布时间】:2020-06-20 10:59:14
【问题描述】:

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

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

(1) VSCode 1.42.1 已安装

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

(3) 使用向导安装 Xdebug 并粘贴我的 phpinfo() 数据以确定正确的版本。当我从 XAMPP 控制面板启动“管理员”并查看 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 脚本的工作与预期一样。

【问题讨论】:

  • 您是在尝试调试命令行脚本还是 Web 应用程序?对于后者,您通常需要安装浏览器扩展程序并从那里启动应用程序。
  • @ÁlvaroGonzález:好问题。第一步是调试一个命令行脚本,一个带有 echo phpinfo() 的简单文件 hello_world.php;以及其中的另一个回声“Hello World”。我可以运行它(上面的第 6 点),但调试器如上所述卡住了
  • 让 VSCode 侦听调试连接,然后检查它是否真的在该端口上侦听(以及那是什么应用程序)。使用netstat 或其他工具(例如带有 GUI 的工具)。根据日志,Xdebug 无法连接到 VSCode 应该监听的 Xdebug TCP 9000 端口。也许它不听?
  • @LazyOne 这听起来像是一个很好的假设......如果 VSCode 不听,那么它可能会卡住(除非有某种超时)。你写 “让 VSCode 监听调试连接” => 我相信这就是 launch.json 的用途,对吗?我启动 XAMPP 和 VSCode 以管理员身份打开 CMD 提示符并运行 netstat -ab。有一个条目TCP 0.0.0.0:9000 [...] LISTENING [Code.exe] ...所以我相信VSCode正在监听...
  • @LazyOne ...感谢您的帮助。你给了我找到解决方案的工具(并意识到我犯的愚蠢错误)。请参阅下面的答案stackoverflow.com/a/60621125/9303446 ...

标签: php visual-studio-code xampp xdebug


【解决方案1】:

@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. 在 shell 中运行 telnet 0.0.0.0 9000telnet localhost 9000 并注意区别:您已连接到 VScode!
root ~ $ telnet 0.0.0.0 9000 
Trying 0.0.0.0... 
Connected to 0.0.0.0.
Escape character is '^]'.
  1. 点击冻结调试弹窗上的停止按钮,在shell中观察
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. launch.json 中的“Listen for XDebug”配置用于调试从浏览器会话启动的脚本:(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”开始调试时将使用它。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 2021-12-02
      • 2013-01-14
      • 2021-03-14
      • 2019-03-15
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多