VSCode 中的 Xdebug 不会在命令行的 Laravel artisan 命令的断点处停止

Posted

技术标签:

【中文标题】VSCode 中的 Xdebug 不会在命令行的 Laravel artisan 命令的断点处停止【英文标题】:Xdebug in VSCode does not stop on breakpoint for Laravel artisan commands from command line 【发布时间】:2021-12-31 14:01:45 【问题描述】:

我在本地机器 (MacOS Cathalina) 上开发 Laravel 7 webapp。对于调试,我使用 VSCode、php Debug 和 Xdebug (3.0.4)。

当我在浏览器中以调试模式打开页面时,执行将在第一行停止,并按预期设置断点。

但是,当我从终端运行php artisan 命令时,执行根本不会在断点处停止。我知道代码可以运行,因为我可以将跟踪打印到日志中。

我在 VSCODE 中使用“Listen to XDebug”选项,这在过去可以正常工作,但我不知道有什么改变。

我尝试将 all possible configs 添加到我的 php.ini 中,但它没有帮助(在重新启动我的 MAMP 之后):

[xdebug]
zend_extension=/Applications/MAMP/bin/php/php7.4.2/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.remote_autostart=on
xdebug.client_host=localhost
xdebug.client_port = 9003
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9003
xdebug.remote_connect_back = 1 
xdebug.idekey = VSCODE

这里是我的launch.json供参考:


    "version": "0.2.0",
    "configurations": [
        
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "log": true 
        ,
        
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "$file",
            "cwd": "$fileDirname",
            "port": 9003,
            "runtimeArgs": [
                "-dxdebug.start_with_request=yes"
            ],
            "env": 
                "XDEBUG_MODE": "debug,develop",
                "XDEBUG_CONFIG": "client_port=$port"
            
        ,
        
            "name": "Launch Built-in web server",
            "type": "php",
            "request": "launch",
            "runtimeArgs": [
                "-dxdebug.mode=debug",
                "-dxdebug.start_with_request=yes",
                "-S",
                "localhost:0"
            ],
            "program": "",
            "cwd": "$workspaceRoot",
            "port": 9003,
            "serverReadyAction": 
                "pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
                "uriFormat": "http://localhost:%s",
                "action": "openExternally"
            
        
    ]

/Applications/MAMP/bin/php/php7.4.2/bin/php --ini 的输出

Configuration File (php.ini) Path: /Applications/MAMP/bin/php/php7.4.2/conf
Loaded Configuration File:         /Applications/MAMP/bin/php/php7.4.2/conf/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

/Applications/MAMP/bin/php/php7.4.2/bin/php -m的输出

[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
imap
intl
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
Phar
posix
readline
Reflection
session
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
tokenizer
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib

[Zend Modules]
Xdebug

哪个php的输出

/usr/bin/php

/Applications/MAMP/bin/php/php7.4.2/bin/php artisan test:xdebug 的输出

__   __   _      _                 
\ \ / /  | |    | |                
 \ V / __| | ___| |__  _   _  __ _ 
  > < / _` |/ _ \ '_ \| | | |/ _` |
 / . \ (_| |  __/ |_) | |_| | (_| |
/_/ \_\__,_|\___|_.__/ \__,_|\__, |
                              __/ |
                             |___/ 

Version => 3.0.4
Support Xdebug on Patreon, GitHub, or as a business: https://xdebug.org/support

           Enabled Features<br/>(through 'xdebug.mode' setting)           
Feature => Enabled/Disabled
Development Aids => ✘ disabled
Coverage => ✘ disabled
GC Stats => ✘ disabled
Profiler => ✘ disabled
Step Debugger => ✔ enabled
Tracing => ✘ disabled

                              Diagnostic Log                              
[Step Debug] WARN: Creating socket for 'localhost:9003', poll success, but error: Operation now in progress (19).
[Step Debug] WARN: Creating socket for 'localhost:9003', poll success, but error: Operation now in progress (19).
[Step Debug] ERR: Could not connect to debugging client. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) :-(

                                   PHP                                   
                           Build Configuration                           
Version => 7.4.2
Debug Build => no
Thread Safety => disabled
                                 Settings                                 
Configuration File (php.ini) Path => /Applications/MAMP/bin/php/php7.4.2/conf
Loaded Configuration File => /Applications/MAMP/bin/php/php7.4.2/conf/php.ini
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)

Directive => Local Value => Master Value
xdebug.mode => debug => debug
xdebug.start_with_request => yes => yes
xdebug.start_upon_error => default => default
xdebug.output_dir => /var/tmp/ => /var/tmp/
xdebug.trigger_value => no value => no value
xdebug.file_link_format => no value => no value
xdebug.filename_format => no value => no value
xdebug.log => /Applications/MAMP/bin/php/php7.4.2/lib/php/extensions/no-debug-non-zts-20190902/xdebug.log => /Applications/MAMP/bin/php/php7.4.2/lib/php/extensions/no-debug-non-zts-20190902/xdebug.log
xdebug.log_level => 7 => 7
xdebug.var_display_max_children => 128 => 128
xdebug.var_display_max_data => 512 => 512
xdebug.var_display_max_depth => 3 => 3
xdebug.max_nesting_level => 256 => 256
xdebug.cli_color => 0 => 0
xdebug.force_display_errors => Off => Off
xdebug.force_error_reporting => 0 => 0
xdebug.halt_level => 0 => 0
xdebug.max_stack_frames => -1 => -1
xdebug.show_error_trace => Off => Off
xdebug.show_exception_trace => Off => Off
xdebug.show_local_vars => Off => Off
xdebug.dump.COOKIE => no value => no value
xdebug.dump.ENV => no value => no value
xdebug.dump.FILES => no value => no value
xdebug.dump.GET => no value => no value
xdebug.dump.POST => no value => no value
xdebug.dump.REQUEST => no value => no value
xdebug.dump.SERVER => no value => no value
xdebug.dump.SESSION => no value => no value
xdebug.dump_globals => On => On
xdebug.dump_once => On => On
xdebug.dump_undefined => Off => Off
xdebug.profiler_output_name => cachegrind.out.%p => cachegrind.out.%p
xdebug.profiler_append => Off => Off
xdebug.cloud_id => no value => no value
xdebug.client_host => localhost => localhost
xdebug.client_port => 9003 => 9003
xdebug.discover_client_host => Off => Off
xdebug.client_discovery_header => no value => no value
xdebug.idekey => VSCODE => VSCODE
xdebug.connect_timeout_ms => 200 => 200
xdebug.scream => Off => Off
xdebug.gc_stats_output_name => gcstats.%p => gcstats.%p
xdebug.trace_output_name => trace.%c => trace.%c
xdebug.trace_format => 0 => 0
xdebug.trace_options => 0 => 0
xdebug.collect_assignments => Off => Off
xdebug.collect_return => Off => Off

如果您对如何调试此问题或可能导致此类行为有任何提示,请告诉我。

【问题讨论】:

如果你在 VSCode 中使用“Listen for Xdebug”配置并且这些 Xdebug 设置是正确的,那么它现在应该可以工作了。如果它不起作用,那么很可能您的 Xdebug 配置不适用于 CLI 环境,并且仅适用于 Web 服务器。执行以下操作:1) 运行 php --ini 并显示输出 2) 制作一些临时工匠命令(例如 xdebug-test)并将 xdebug_info(); 放入该命令代码中。 3) 在 CLI (php artisan xdebug-test) 中运行该命令并显示整个输出——需要查看 CLI 环境的 LIVE/实际 Xdebug 设置。 @LazyOne 感谢上述提示。 php --ini 并没有真正从项目文件夹中给我任何有用的东西,我将其添加到帖子中。你想看看 phpinfo() 的输出吗?哪一部分?我还创建了 temp artisan 命令,但 xdebug_info() 未被识别为函数,因此我收到一条错误消息。我应该如何运行?谢谢! 这意味着您的终端中的 PHP 没有在您的操作系统范围的 PHP 中配置 Xdebug。试试php -m——你看到那里列出了xdebug模块吗? which php 的输出是什么(或者可能是 where php——我在 Windows 上,所以不确定 Mac 上哪个是正确的) 也尝试执行/Applications/MAMP/bin/php/php7.4.2/php我认为这将是正确的路径,但不是非常确定)。它有效吗?如果是 - 尝试使用 --ini 参数并在您的 php artisan xdebug-test 命令中使用该路径而不是 php “随意添加解决方案,你真的帮我解决了这个问题。非常感谢!”我建议你发布你自己的答案(你可以稍后接受)与所有步骤。这将帮助处于类似情况的其他人(接受答案的问题比一堆 cmets 更明显)。 【参考方案1】:

终于在@LazyOne 的帮助下,我可以解决这个问题。

问题的根本原因是由于 macOS 更新,我在 VSCODE 中的终端被替换为新终端 zsh。

此终端没有配置正确的 php 路径/版本,因此当我从命令行运行 artisan 命令时,我使用未安装 Xdebug 的默认 php 版本运行它。

当我将路径更改为安装在我的 MAMP 包下的 php 版本时,它就可以工作了。为了方便起见,我在 zsh 配置文件中添加了一个别名,指向正确的 php 版本。

【讨论】:

以上是关于VSCode 中的 Xdebug 不会在命令行的 Laravel artisan 命令的断点处停止的主要内容,如果未能解决你的问题,请参考以下文章

VSCODE 中的 PHP 7 Xdebug:如何忽略异常

带有 Xdebug 的 PHPUnit 测试资源管理器 - VSCode

xdebug3+php8.0+vscode断点调试php程序

VSCode中设置断点调试PHP

vscode使用xdebug断点调试php代码

在vscode中使用xdebug