检查 xdebug 是不是正常工作

Posted

技术标签:

【中文标题】检查 xdebug 是不是正常工作【英文标题】:Check if xdebug is working检查 xdebug 是否正常工作 【发布时间】:2012-12-12 08:39:23 【问题描述】:

在不安装文本编辑器或IDE的情况下,是否可以测试xdebug是否正常工作,即是否可以调试php代码?

在 phpinfo() 中出现的唯一部分 xdebug 如下:

额外的.ini文件解析/etc/php5/apache2/conf.d/mysql.ini, /etc/php5/apache2/conf.d/mysqli.ini, /etc/php5/apache2/conf.d/pdo.ini, /etc/php5/apache2/conf.d/pdo_mysql.ini, /etc/php5/apache2/conf.d/xdebug.ini

其他地方的 phpinfo() 中没有提到。

【问题讨论】:

phpinfo() 是否将其报告为已加载的扩展程序?这就是你所说的“工作”吗? 如果它显示在您的 phpinfo() 上,您可以尝试在 Xdebugs 端口(默认为 9000)上远程登录 @Wiseguy,我已经更新了这个问题。这是否意味着它已加载/正常工作? @tix3,我已经更新了这个问题。这是否意味着它已加载/正常工作? 如果实际加载了扩展,它应该有自己的部分来列出其配置指令。 【参考方案1】:

如果不实际进行一些调试,我猜你无法确定调试器正在工作。

但是你可以很确定——我想人们应该假设如果 xDebug 的某些方面正常工作,那么它就会全部正常工作。

鉴于此,您可以通过尝试以下操作来确认 xDebug 已安装并到位:

1) phpinfo() -- 这将显示所有已加载的扩展,包括 xDebug。如果它在那里,那么可以肯定它正在工作。

2) 如果这对您来说还不够好,您可以尝试使用var_dump() 函数。 xDebug 修改var_dump() 的输出以包含附加信息。如果这已经到位,那么 xDebug 正在工作。

3) xDebug 修改 PHP 的错误输出。如果您的程序在使用 xDebug 时崩溃,您将获得比标准 PHP 崩溃输出更多的失败信息。

4) xDebug 还为 PHP 添加了许多辅助函数。您可以尝试其中的任何一个,看看它是否有效。例如,函数xdebug_get_code_coverage() 应该存在并返回一个数组。如果是,则安装 xDebug。如果不是,那就不是。

【讨论】:

phpinfo() 仅在Additional .ini files parsed 中提及 xdebug。现在检查您的其他建议。 刚试过xdebug_get_code_coverage(),我得到Fatal error: Call to undefined function xdebug_get_code_coverage() in /var/www/xdebug.php on line 5 很公平。这相当确凿地告诉你 xdebug 没有正确安装。 仅供参考,如果是这种情况,那么您应该打开您的/etc/php/conf.d/xdebug.ini 文件,这是在解析的其他 .ini 文件中提到的文件,并取消注释其中的所有行。 zend_extension=xdebug.so xdebug.remote_enable=on xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_handler=dbgp @TonyMorello 我认为这对我有帮助,因为我的 php.ini 使用完整路径正确设置,但在 Debian 中还有一个 /mods-available 目录并且 xdebug.ini 设置存在冲突(我认为)我的 php.ini 设置。【参考方案2】:

运行

php -m -c

在您的终端中,然后查找[Zend Modules]。如果已加载,它应该在某处!

注意

如果您使用的是 Ubuntu,它可能不会显示在此处,因为您需要将 /etc/php5/apache2/php.ini 中的 xdebug 设置添加到 /etc/php5/cli/php.ini

我的 Xdebug 设置:

对于 Xdebug 3 (及以上)

[xdebug]
zend_extension = /usr/lib/php5/20121212/xdebug.so
xdebug.mode=debug
xdebug.client_host=localhost
;# The default is 9003
xdebug.client_port=9000

对于 Xdebug 2.9 (或以下)

[xdebug]
zend_extension = /usr/lib/php5/20121212/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000

【讨论】:

php --version 如果加载了 Xdebug 也会列出 @mfink php --version 对我不起作用。刚启动我的机器,在 Apache 启动并工作后,php --version 显示 Xdebug,但 phpinfo() 不显示 xdebug 部分。并且 PHP 脚本执行不会在断点处停止。在我运行service apache2 restart 之后,phpinfo() 显示 xdebug 部分并且调试工作正常。因此,由于某种原因,在机器启动期间启动 Apache 时没有加载 xdebug。所以现在我必须在每次启动后重新启动 Apache。【参考方案3】:

在您的问题中,您提到您的 phpinfo 声明 apache 正在 /etc/php5/apache2/conf.d/xdebug.ini 中加载 xdebug 的配置 在许多在线说明中,您可能会注意到他们要求您将 xdebug 配置放入 php.ini(这就是我所做的)但是,如果配置设置为 /etc/php5/apache2/conf.d/xdebug。 ini,那么您应该从 /etc/php5/apache2/php.ini 中删除 [XDebug] 配置设置并将其放入 /etc/php5/apache2/conf.d/xdebug.ini INSTEAD。一旦我从 /etc/php5/apache2/php.ini 中删除并改为放入 /etc/php5/apache2/conf.d/xdebug.ini 并重新启动 apache,它就可以工作了!!

因此,在您的 /etc/php5/apache2/conf.d/xdebug.ini 中,输入以下内容:

[XDebug]
zend_extension="/usr/lib/php5/20121212+lfs/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9000"
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/home/paul/tmp"

xdebug.remote_host="localhost"
xdebug.remote_handler="dbgp";
xdebug.idekey="phpstorm_xdebug"

然后从 /etc/php5/apache2/php.ini 中删除它,如果你也把它放在那里的话。

然后做:

sudo service apache2 重启

那么它应该可以工作了!!!

【讨论】:

【参考方案4】:

经过近 24 小时的苦苦运行,试图让 xdebug 与 Netbeans 8.0.2 一起工作,我找到了一个解决方案,我希望它适用于所有 Ubuntu 和 Ubuntu 相关堆栈。

问题一:PHP 和 xdebug 版本必须兼容

有时,如果您正在运行 Linux 设置并 apt-get 安装 xdebug,它不会为您提供正确的 xdebug 版本。就我而言,我有最新的 php 版本,但有一个旧的 xdebug 版本。那一定是由于我当前的 Xubuntu 版本。软件版本取决于存储库,而存储库又取决于您运行的操作系统版本。

解决方案:PHP 有一个简洁的扩展管理器,称为 PECL。按照here 的说明启动并运行它。 首先,正如 cmets 的一位成员所指出的,您应该安装 PHP 的开发人员包才能使 PECL 工作:

sudo apt-get install php5-dev

然后,使用 PECL,您将能够安装最新的稳定版本的 xdebug:

sudo pecl install php5-xdebug

完成后,将安装正确版本的 xdebug,但尚未准备好使用。之后,您需要启用它。我已经看到很多关于如何做到这一点的建议,但事实是 PHP 需要为客户端和服务器启用一些模块,在本例中为 Apache。似乎这里的最佳实践是使用启用模块的内置方法,称为 php5enmod。用法描述here。

问题二:正确启用模块

首先,您需要进入 /etc/php5 文件夹。在那里,您会找到 3 个文件夹,apache2、cli 和 mods_available。 mods_available 文件夹包含带有激活给定模块的说明的文本文件。命名约定是 [module].ini。看看其中的几个,看看它们是如何设置的。

现在您必须在 mods_available 文件夹中创建您的 ini 文件。创建一个名为 xdebug.ini 的文件,并在该文件中粘贴以下内容:

[xdebug]
zend_extension = /usr/lib/php5/20121212/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000

确保指令 [xdebug] 存在,与上面的示例完全相同。模块必须工作。事实上,只需复制并粘贴整个代码,这样你就会成为一个更快乐的人。 :D

注意:zend_extension 路径非常重要。在本例中,它指向 PHP 引擎的当前版本,但您应该首先转到 /usr/lib/php5 并确保以数字命名的文件夹是正确的。将名称调整为您在那里看到的任何名称,当您使用它时,检查文件夹内部以确保 xdebug.so 确实存在。它应该是,如果你做的一切正确。

现在,随着您的 xdebug.ini 创建,是时候启用该模块了。为此,请打开控制台并输入:

php5enmod xdebug

如果一切顺利,PHP 会创建两个指向该文件的链接,一个在 /etc/php5/apache2/conf.d 内,另一个在 /etc/php5/cli/conf.d 内

重新启动您的 Apache 服务器并在控制台上输入:

php -v

你应该得到这样的东西:

PHP 5.5.9-1ubuntu4.6 (cli) (built: Feb 13 2015 19:17:11) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.3.1, Copyright (c) 2002-2015, by Derick Rethans

这意味着 PHP 客户端确实读取了您的 xdebug.ini 文件并加载了 xdebug.so 模块。到目前为止一切顺利。

现在在您的 Web 服务器的某处创建一个 phpinfo 脚本,然后运行它。如果一切正常,这就是你应该看到的:

如果你看到这个,Apache 也加载了这个模块,你可能已经准备好了。现在让我们看看 Netbeans 是否能正确调试。创建一个非常简单的脚本,添加一些变量,给它们赋值,并在它们上设置一个断点。现在点击 CTRL+F5,点击调试器面板上的“step in”,看看你是否得到这样的结果:

记得在 tools/options/php 下检查 Netbeans 配置以进行调试。它应该看起来像这样:

我希望这能对这个相当模糊、令人困惑的问题有所了解。

祝你好运!

【讨论】:

为我工作,这个答案可能应该在 xdebug 或 netbeans 网站上 我必须安装 PHP 的开发包才能让 PECL 工作:sudo apt-get install php5-dev. 另外,php5enmod 不会在 ini 文件中创建任何链接,没有它也可以很好地工作。 还有一件事:ini 文件中的[xdebug] 指令对于使其正常工作至关重要。我很困惑,在原始 ini 文件中,[xdebug] 丢失了,但对我来说,没有它就无法工作。 您好!您对安装 PHP 的开发人员包是正确的,我将相应地更新帖子。不确定您对 php5enmod 的评论。它在我指定的文件夹上创建链接。是的,[xdebug] 指令是必不可少的,我也会更新帖子以反映这一点。感谢您的反馈!【参考方案5】:

如果您使用的是 Eclipse,那么请注意,在 XDebug 模式下运行时,魔术常量 __FILE__ 将始终被计算为:

xdebug://debug-eval

因此,如果您的会话在 XDebug 下,则以下检查将返回 true

$is_xdebug = false !== strpos(__FILE__,'xdebug'); // true while on XDebug

【讨论】:

【参考方案6】:

尝试如下,将返回xDebug does exists.xDebug doesn't exists.

<?=sprintf('xDebug does%s exists.', extension_loaded('xdebug') ? '' : "n't");

在 CLI 上:

php -r "printf('xDebug does%s exists.' . PHP_EOL, 
extension_loaded('xdebug') ? '' : 'n\'t');"

【讨论】:

【参考方案7】:

你可以运行这个小php代码

<?php
phpinfo();
?>

复制整个输出页面, 将其粘贴到此link 中。然后分析。它将显示是否安装了 Xdebug。它会给出完成安装的说明。

【讨论】:

【参考方案8】:

只是为了扩展KsaRs 的答案并提供从命令行检查 xdebug 的可能性:

php -r "echo (extension_loaded('xdebug') ? '' : 'non '), 'exists';"

【讨论】:

【参考方案9】:

从 xdebug 3 开始,您可以使用以下命令行:

php -r "xdebug_info();"

它会显示有关您的 xdebug 安装的有用信息。

【讨论】:

【参考方案10】:

注意xDebug 3 的配置选项have changed。 PhpStorm 手册:Configure xDebug 也很好地解释了它(它带有一个验证器脚本,正在上传)。 搞砸了一个无法配置的PECL版本后,答案是:

su
dnf remove php-xdebug
dnf install php-devel

cd /usr/src
wget https://xdebug.org/files/xdebug-3.0.4.tgz
tar -xvzf xdebug-3.0.4.tgz
cd xdebug-3.0.4/
phpize
./configure --enable-xdebug
make
make install

xDebug 3 可以使用这样的配置(注意 [xdebug] 部分):

; Enable xdebug extension module
zend_extension=xdebug.so

[xdebug]
xdebug.mode=debug
xdebug.client_host=localhost
xdebug.client_port=9003

这两个文件中的内容:

nano /etc/php-cli.d/xdebug.ini
nano /etc/php.d/xdebug.ini 

然后可以允许网络连接并重新加载 INI:

setsebool -P httpd_can_network_connect 1
systemctl restart php-fpm.service

最后:

php -r "xdebug_info();"

【讨论】:

【参考方案11】:

您可以在终端中使用 php -v 命令检查是否安装了 xdebug

【讨论】:

【参考方案12】:

我意识到这个问题有点老了,但是 xdebug 3 出来了,很多事情都发生了变化。

php.exe -r "xdebug_info();"

仍然可以,但是php.ini中的配置不同:

对于xampp 安装(php 8.0.12)我有:

[xdebug]
zend_extension="C:\xampp\php\zend_ext\php_xdebug-3.1.1-8.0-vs16-x86_64.dll"
xdebug.output_dir="c:/xampp/xdebug"
xdebug.mode=debug
xdebug.log=c:/xampp/xdebug/xdebug.log
xdebug.log_level=7
xdebug.profiler_output_name=%p.%t.cgrind

这也会写一个xdebug.log文件,内容如下:

[8028] Log opened at 2021-10-28 09:42:33.878279
[8028] [Config] INFO: Trigger value for 'XDEBUG_TRIGGER' not found, falling back to 'XDEBUG_SESSION'
[8028] [Config] INFO: No shared secret: Activating
[8028] [Step Debug] INFO: Connecting to configured address/port: localhost:9003.
[8028] [Step Debug] ERR: Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) :-(
[8028] Log closed at 2021-10-28 09:42:34.298475

对于wampserver,xdebug 已包含在内并且开箱即用。这使它更容易使用。

【讨论】:

以上是关于检查 xdebug 是不是正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Phpstorm、xdebug 和 vagrant 仍在等待传入连接

Xdebug 停止工作并且无法在断点处停止

Xdebug - 没有配置文件或跟踪输出

Xdebug MacOS Big Sur M1(ARM)

为啥 xdebug 没有出现在 phpinfo() 中

一步一步:如何进行 Xdebug 故障排除连接到客户端 IDE