【问题标题】:Xdebug with Visual Studio Code ignores some breakpoints带有 Visual Studio Code 的 Xdebug 会忽略一些断点
【发布时间】:2019-12-10 21:42:10
【问题描述】:

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

php.ini的Xdebug部分:

xdebug.profiler_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back=1
xdebug.remote_enable = 1
xdebug.remote_port = 9000

这是我的launch.json

{
    // 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
        }
    ]
}

我尝试了什么:

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

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

 public function testCreateWhenAllParametersAreCorrectlySpecifiedReturnsCompany()
 {
•    $attributes = [
         'business_name' => 'DANONE'
     ];

     $address = factory(Address::class)->create();

     $company = Company::create($attributes, $address);

     $this->assertInstanceOf(Company::class, $company);

     $this->assertDatabaseHas('companies', [
•        'address_id' => $address->id,
         'business_name' => 'DANONE'
     ]);
 }

如何让 Xdebug 与 Visual Studio Code 打到所有断点还是这是正常行为?提前感谢您的帮助。

更新 #1 (08/07/2019)

Zend 扩展路径在我的php.ini 中指定,如下所示。

zend_extension = "/usr/local/Cellar/php@7.2/7.2.18/pecl/20170718/xdebug.so"

我尝试在我的settings.json 中添加php.validate.executablePath

更新 #2 (08/08/2019)

根据本次更新时的 cmets 和答案,Xdebug 忽略某些行是正常行为。那么我的问题是为什么有些行被忽略了?哪些行会被忽略?有官方名单吗?

【问题讨论】:

  • 那些不工作的断点在哪里?它们是什么线?欢迎截图。尝试在您的代码中放置xdebug_break();,看看它是否会触发它。附言我建议在实际的代码行上放置断点,它们最好是单行/简单指令。由于 PHP 生成字节码的方式,一些断点的行与您期望的不同(例如,多行数组声明——它会在中间的某个地方)。附言也许 VSC 不支持“方法断点”(当它放在函数声明行时)。
  • P.S.如果一个断点有效而另一个断点无效,那么更改端口将无济于事。仅当您根本没有收到来自 Xdebug 的任何连接时才需要更改端口(例如,某个其他服务正在该端口上运行,例如 php-fpm 是典型情况)。在任何情况下:启用和收集,然后检查 Xdebug 日志——它会告诉它尝试连接的位置(以及它是否成功)、在哪些行设置了断点等。
  • 请添加代码以及断点在哪些特定行上不起作用?
  • PPS Xdebug 2.8 应该有“断点验证”机制:如果该行中设置的断点将被命中或不是。显然,调试客户端(IDE/编辑器)也需要了解/支持这一点。
  • @rkeet 请使用您需要的任何 URL(越多越好):它会提供更好的答案,而无需通过 cmets,例如解释为什么这样的断点没有被点击/链接到存在此类解释的票证等。

标签: php laravel visual-studio-code xdebug


【解决方案1】:

在 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
];

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

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

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

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

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


所以:是的。

如果您放置的断点略有不同,它们会暂停执行。不暂停隐式是正常行为。


要完整:

在本地 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;

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

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
  • (要启用xdebug,请在开始使用docker-compose up时在应用程序中将XDEBUG_ENABLED环境配置设置为1
  • (将“ProjectName”替换为项目名称,在 Xdebug 的 PhpStorm 设置中的“服务器”配置中使用该名称)

Dockerfile

pecl install xdebug-2.7.2 redis && \
docker-php-ext-enable xdebug redis && \
  • (确保将xdebug-2.7.2替换为您想要的版本/与您的PHP版本兼容,check that here

编辑:基于 OP 问题的 cmets 附加。

有很多错误报告(请参阅那些 cmets,感谢 LazyOne 找到它们)。

他提供的最后一个 URL 很有趣,因为它是关于即将到来的 V2.8.0(目前在 2.8.0beta1,不是一般版本),他在this ticket 中提到了 Xdebug 不会暂停隐式分配的执行:

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

(Xdebug 的作者 Derick 于 2019-05-06 12:49 引用)

您可以查看 changelog pageroadmap 的 Xdebug。

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

对于 2.8.0,它表明将为 IDE 添加对 IDE 的支持,以显示是否可以解析断点。它的当前发布日期设置为 2019-09-30。

发布

【讨论】:

    【解决方案2】:

    在 vscode 中不能被定义的数组打破
    我的建议是获取一些 if 或其他代码,如下所示:

     public function testCreateWhenAllParametersAreCorrectlySpecifiedReturnsCompany()
     {
    •   $debug = 'true';
        $attributes = [
             'business_name' => 'DANONE'
         ];
    
         $address = factory(Address::class)->create();
    
         $company = Company::create($attributes, $address);
    
    •    $this->assertInstanceOf(Company::class, $company);
    
         $this->assertDatabaseHas('companies', [
             'address_id' => $address->id,
             'business_name' => 'DANONE'
         ]);
     }
    

    然后按f10按钮继续

    【讨论】:

    【解决方案3】:

    我也遇到过这个问题,laravel,我发布了我为解决这个问题所做的步骤 我在 PHP 中使用 laragon

    添加了一个新的php版本, 还更新了 composers PHP 路径(不知道这一步是否需要,但我做了并指向了最新的 PHP 版本)

    下载xdebg.dll并放入文件夹

    更新了php.ini中的配置

    [xdebug]    
     zend_extension = D:\lrgn\bin\php\php-7.2.7\ext\php_xdebug-2.6.1-7.2-vc15-nts-x86_64.dll
     xdebug.remote_autostart=1
     xdebug.remote_enable=1
     xdebug.remote_connect_back = 1
     ;xdebug.remote_log= D:\lrgn\bin\log\xdebug.log
    

    我没有 xdebug.remote_port = 9000

    在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
            }
        ]
    }
    

    在 vscode 上

    在首选项 --> 设置中 (ctrl+,)

    添加/更新: php.validate.executablePath: "D:\lrgn\bin\php\php-7.2.7\php.exe"(我的在这里)

    重新启动的服务器(laragon) 停止 laravel 对项目进行了作曲家更新(不确定这个阶段是否需要) 再次启动 laravel 项目

    在浏览器上打开 laravel 项目

    在 vscode 上甚至在方法中设置一些刹车点

    在调试部分 -> 监听 XDebug

    在浏览器上重新加载页面

    是的,直接命中

    【讨论】:

    • "laragon <3 是指心脏还是小于 3?
    • 感谢您的回答。您是说使用 Laragon 解决了您的问题吗? Zend 扩展路径在我的php.ini 中指定,我尝试在settings.json 中添加php.validate.executablePath。断点仍然被忽略。
    【解决方案4】:

    我遇到了同样的错误。

    我修复了只下载旧版本的 xdebug。

    你可以从这个link下载它。

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2017-04-18
      • 1970-01-01
      • 2012-12-11
      相关资源
      最近更新 更多