OSX上的xdebug部分工作(例如,在终端中打印堆栈跟踪,但不在浏览器中打印)


xdebug on OS X partially working (e.g., prints stack trace in terminal but not browser).

我正试图让xdebug在我的Mac上运行。我使用的是内置Apache(2.2.1)和PHP(5.3.8)版本的OS 10.6。我遵循了xdebug网站上的"定制安装说明",基本上包括以下步骤:

  1. 从源代码构建xdebug(2.1.3版)
  2. xdebug.so移动到/usr/lib/php/extensions/no-debug-non-zts-20090626
  3. 添加到php.ini:zend_extension=/usr/lib/php/extensions/no-debug-non-zts-2000626/xdebug.so
  4. 重新启动Web服务器

据我所知,应该是这样的。我知道大多数人在像PHPClipse这样的IDE中使用xdebug,但这听起来并不是仅仅为了在页面上获得调试输出所必需的。很多旧的说明都涉及安装MAMP,但看起来已经没有必要了。

xdebug正在工作的迹象:当我运行php -mphpinfo()时,我会得到关于xdebug的预期信息。在脚本中,我可以调用xdebug_is_enabled()(返回1)和xdebug_get_function_stack()(返回堆栈)等函数。

xdebug不工作的原因:我安装xdebug的主要原因是在出现错误时获取堆栈跟踪,而这并没有发生。根据这个文档页面,只要在php.ini中将display_errors设置为On(就是这样),我就应该得到一个堆栈跟踪。我尝试过应该引起警告的代码(例如,echo(hello))以及产生致命错误的代码(如,当$x不是对象时,$x->awesomefunction())。两者都不会产生任何xdebug输出,而致命的错误只会导致页面静默地终止。我链接到的文档中给出的测试代码也不会产生任何结果。

UPDATE:事实证明,如果我从终端运行一个出现致命错误的脚本,我确实会从xdebug获得堆栈跟踪。然而,当我从浏览器运行脚本时,它仍然没有显示出来

此外,常规的错误报告现在已经中断:以前,我会通过包含以下命令来获得错误输出:

ini_set("display_errors","1");
ERROR_REPORTING(E_ALL);

现在,把这些行放在我的脚本中也不会产生任何错误报告。(在浏览器中。当我从终端运行脚本时,它确实会导致显示错误。)

那么,这里出了什么问题?我在xcode安装中遗漏了什么吗?我的系统中是否有一个设置挂在其他地方,以抑制错误?我已经尝试了我能想到的一切,但我很乐意测试你的任何想法。

如果它在控制台上工作,而不是在浏览器上工作,那么可能是xdebug配置问题。

我不是Mac用户,但在Ubuntu上有两个不同的php.ini文件,一个用于控制台,另一个用于apache。如果Mac也是如此,您可以检查xdebug是否已启用,并在两个php.ini文件中正确设置。

此外,您还可以检查指南中提到的xdebug设置。

经过几个小时的反复研究,我发现我的一个测试文件实际上包含了另一个将display_errors设置为0的文件。另一个测试文件直接来自xdebug站点,但我认为在使用它的时候,我引入了一些其他配置错误,使它无法正常工作。我真的很尴尬!让这成为今天关于调试过程中系统的、可重复的测试的重要性的对象课程。从好的方面来看,xdebug现在正在像桃子一样工作。

总之,一系列行之有效的步骤是:

  1. 从源代码构建xdebug(2.1.3版)
  2. 将xdebug.so移动到/usr/lib/php/extensions/no-debug-non-zts-20090626
  3. 添加到php.ini:zend_extension=/usr/lib/php/extensions/no-debug-non-zts-2000626/xdebug.so
  4. 添加到php.ini:display_errors=打开
  5. 重新启动Web服务器