带有Visual Studio Code的Xdebug会忽略一些断点

lou*_*her 8 php xdebug laravel visual-studio-code

我使用带有PHP Debug扩展的Visual Studio Code来调试Laravel项目。但是有些断点被忽略了,我不知道为什么。我坚持并非所有断点都被忽略的事实。例如,方法声明处的所有断点都将被忽略,而变量声明处的所有断点将被命中。

我的Xdebug部分php.ini

xdebug.profiler_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back=1
xdebug.remote_enable = 1
xdebug.remote_port = 9000
Run Code Online (Sandbox Code Playgroud)

这是我的launch.json

xdebug.profiler_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back=1
xdebug.remote_enable = 1
xdebug.remote_port = 9000
Run Code Online (Sandbox Code Playgroud)

我试过的

  • 将默认端口9000更改为9001
  • 卸载并重新安装PHP调试扩展(您永远不会知道)

示例:“•”表示行断点。下面的代码示例中的所有断点都将被忽略。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "log": true
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如何在Visual Studio Code达到所有断点的情况下获取Xdebug,还是这是正常现象?预先感谢您的帮助。

更新#1(08/07/2019)

Zend扩展路径在我的php.ini下面指定。

zend_extension = "/usr/local/Cellar/php@7.2/7.2.18/pecl/20170718/xdebug.so"
Run Code Online (Sandbox Code Playgroud)

我试图添加php.validate.executablePath我的settings.json

更新#2(08/08/2019)

根据此更新时的评论和答案,Xdebug忽略某些行是正常行为。我的问题是,为什么有些行会被忽略?哪些行被忽略?有正式名单吗?

rke*_*eet 4

在 PhpStorm 中运行它,但由于 Xdebug 在 PHP 上运行,行为是相同的。

当事情“完成”时,Xdebug 停止,即事情“完成”。这可以是函数调用、变量赋值、数据转换等。所有这些的共同点是它们必须是显式的。隐式赋值将被忽略。

Xdebug 不会暂停放置在操作“中”的断点的执行。这就是为什么代码中的第一个断点不起作用,而第二个断点却起作用。

显式和隐式示例:

$attributes = [                   // this is implicitly an array, no pausing execution
    'business_name' => 'DANONE'   // this is explicitly assigned a string, execution paused
];
Run Code Online (Sandbox Code Playgroud)

一些屏幕截图(代码来自 Symfony 4 public/index.php,有一些明显的添加 - 蓝色背景暂停执行“当前行”):

示例1

清楚地执行if()语句内的函数 - 它暂停

示例2

正如我们所看到的,该数组的所有 3 行上都有断点。然而,它唯一暂停的是键/值对的分配。这是显式完成的,数组本身是隐式声明的。

实施例3

这里我们显式声明$testArray为一个数组。所以:它暂停了。

实施例4

这是完整的,可以在上面添加。隐式设置类型数组,但显式分配键/值。


所以:是的。

如果您将断点放置得稍有不同,它们就会暂停执行。不停留在隐含的问题上是正常行为。


完整:

在本地 Apache 安装中,我有以下配置:

[XDEBUG]
zend_extension = C:\xampp\php\ext\php_xdebug-2.7.1-7.3-vc15-x86_64.dll

xdebug.remote_mode = req
xdebug.remote_connect_back = 1
xdebug.default_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
xdebug.max_nesting_level = 200;
Run Code Online (Sandbox Code Playgroud)

但我通常在 Docker 中运行它。在 PHP 图像中docker-compose

environment:
  PHP_XDEBUG_ENABLED: ${XDEBUG_ENABLED:-0}
  PHP_IDE_CONFIG: ${PHP_IDE_CONFIG:-serverName=ProjectName}
  XDEBUG_CONFIG: >
    idekey=PHPSTORM 
    remote_host=${XDEBUG_REMOTE_HOST_IP:-host.docker.internal}
    remote_port=${XDEBUG_REMOTE_PORT:-9000}
    remote_enable=1
Run Code Online (Sandbox Code Playgroud)
  • (要启用xdebug,请在开始使用时将XDEBUG_ENABLED环境配置设置为应用程序中)1docker-compose up
  • (将“ProjectName”替换为项目名称,在 Xdebug 的 PhpStorm 设置中的“服务器”配置中使用该名称)

并在Dockerfile

pecl install xdebug-2.7.2 redis && \
docker-php-ext-enable xdebug redis && \
Run Code Online (Sandbox Code Playgroud)
  • (确保替换xdebug-2.7.2为您想要的版本/与您的 PHP 版本兼容,请在此处检查

编辑:根据对OP问题的评论进行补充。

有大量错误报告(请参阅这些评论,感谢LazyOne发现了它们)。

他提供的最后一个 URL 很有趣,因为它是关于即将推出的 V2.8.0(目前为 2.8.0beta1,不是一般版本),他在这张票中评论了Xdebug 不会暂停隐式赋值的执行:

我刚刚将其合并到 master 分支中,它将成为 2.8.0 的一部分。我很快就会发布 2.7.2(这周,今天?!),然后可能下周发布 2.8alpha1 版本,以便人们可以尝试一下。

(引自 Xdebug 作者 Derick 2019-05-06 12:49)

您可以查看Xdebug 的变更日志页面路线图

该路线图显示了将包含的所有功能/修复。

对于 2.8.0,它表明将添加对 IDE 的支持,以显示 IDE 是否可以解析断点。目前的发布日期定为 2019 年 9 月 30 日。

已发布