8

我正在尝试远程调试一个 php web 应用程序,但是每当我尝试启动调试会话时,Eclipse 都会给我带来一堆弹出窗口:

调试器错误:“没有找到合适的文件或没有选择文件。调试终止”

在此处输入图像描述

这是我当前的 Xdebug 2.2.1 配置:

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=0
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"

这是我的 Eclipse 4.2.1 调试配置:

在此处输入图像描述

Xdebug 已正确安装,我在 phpinfo() 输出中看到它已启用。

4

5 回答 5

6

我尝试调试 Eclipse 以了解我的 Mac OS X 中发生了什么。
首先找到当前的 Eclipse 运行进程:

$ ps -ef | grep eclipse
   501 15160   373   0  4:21PM ??         2:57.19 /Users/myuser/apps/eclipse/Eclipse.app/Contents/MacOS/eclipse -psn_0_651423

然后跟踪 Eclipse 系统调用:

$ sudo dtruss -fp 15160

 [... omissis ...]
 accept(0xA0, 0x1224C37E8, 0x1224C37E4)      = 103 0
 setsockopt(0x67, 0xFFFF, 0x1002)        = 0 0
 setsockopt(0x67, 0xFFFF, 0x1001)        = 0 0
 read(0x67, "4\0", 0x1)      = 1 0
 read(0x67, "7\0", 0x1)      = 1 0
 read(0x67, "7\0", 0x1)      = 1 0
 read(0x67, "\0", 0x1)       = 1 0
 read(0x67, "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<init xmlns=\"urn:debugger_protocol_v1\" xmlns:xdebug=\"http://xdebug.org/dbgp/xdebug\" fileuri=\"file:///opt/local/var/db/php5/pear/pear-ini.php\" language=\"PHP\" protocol_version=\"1.0\" appid=\"14961\" idekey=\"ECLIPSE_DB", 0x1DD)         = 477 0
 read(0x67, "\0", 0x1)       = 1 0
 [... omissis ...]

在这里,我捕获了从 xdebug 发送的第一行。
这是 eclipse 正在读取一段 XML 的行。我想这是 DBGp 部分。

 <?xml version="1.0" 
       encoding="iso-8859-1"?>
 <init xmlns="urn:debugger_protocol_v1" 
       xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
       fileuri="file:///opt/local/var/db/php5/pear/pear-ini.php" 
       language="PHP" 
       protocol_version="1.0" 
       appid="14961" 
       idekey="ECLIPSE_DB

看着fileuri我发现 Xdebug 正在尝试使用/opt/local/var/db/php5/pear/pear-ini.php. 该文件pear-ini.php在我的 Eclipse 项目中不存在。

所以我在我的 Eclipse 工作区中创建了一个新项目,在这里我复制了文件/opt/local/var/db/php5/pear/pear-ini.php

它起作用了,Eclipse PDT 现在找到了它正在寻找的文件,并且调试器终于正确启动了。它甚至问我是否想切换到调试视角。

结论
如果你遇到这个奇怪的错误:“没有找到合适的文件或没有选择文件。 ”,那么这就是写的内容。好的,我的 Eclipse 无法找到该文件,但这也意味着它正在尝试查找其工作区之外的文件。可能是由于某种奇怪的原因从 PHP 引擎加载的文件。在我的情况下pear-ini.php由自动添加pear.ini

$ cat pear.ini 
 ; Do not edit this file; it is automatically generated by MacPorts.
 ; Any changes you make will be lost if you upgrade or uninstall php5-pear.
 ; To configure PHP, edit /opt/local/etc/php5/php.ini.
 auto_prepend_file = '/opt/local/var/db/php5/pear/pear-ini.php'
于 2013-02-28T16:57:06.423 回答
3

我遇到了同样的问题,虽然 freedev 的回答为我指明了正确的方向,但它实际上并没有解决它。

使用 dtruss 没有帮助:我在<init>任何地方都没有看到那个 XML 元素。xdebug.remote_log=/tmp/xdebug.log但是一旦我设置,我就能够找到它php.ini,然后在/tmp/xdebug.log我尝试启动远程调试会话时跟踪文件。/opt/local/var/db/php5/pear/pear-ini.php再次被提及。但是我的文件系统中那个文件,所以我不知道为什么我仍然收到这个关于文件丢失的模糊错误消息。

然而,既然我知道Pear 与问题有关,我尝试简单地卸载 Pear ( sudo port uninstall php53-pear),因为我实际上不再使用它了。你瞧,这解决了它!我不再收到“没有适当的文件”错误消息,我可以正常调试。

卸载 php53-pear 后,fileuri该 XML 数据中的设置现在是index.php我一直在尝试调试的 Drupal 站点的文件。因此,我认为您应该期望 Web 请求的入口点文件出现在该 XML<init>元素中。不过,我希望我知道为什么安装 Pear 会更改该fileuri属性。能够将 Pear 配置为停止与 Xdebug 混淆会比卸载 Pear 好得多。

于 2014-12-04T19:34:03.947 回答
1

我遇到了同样的问题,原因不是pear.inipear-ini.php如上所述。

原因很简单。我已经在我的 Eclipse 环境中安装了 PDT 和 Aptana PHP 插件。只需将项目类型和调试配置类型都切换为 PDT,一切正常。

感谢您发布一个不错的主题。:)

于 2014-02-26T14:03:15.153 回答
0

我正在使用 Linux 并使用 strace 附加 Eclipse 进程(当然是真正的 Java 子进程)我无法捕捉到此类错误。

对于那些遇到同样问题但未能成功解决的人,如果您不久前完成了 Eclipse 或 PDT 更新,请尝试删除您的项目并重新创建它。它解决了我的 xdebug 调试和 Eclipse 项目清理没有的问题。

于 2013-08-05T12:06:20.647 回答
0

如果您的调试器过去可以工作,但突然开始抛出该消息,那么您可能只是为一个源文件添加了书签,而 Eclipse 并不认为它是项目的一部分,或者根本找不到它。

例如,当我调试为 Wordpress 编写的插件时,我为一些外部 Wordpress 文件添加了书签,似乎 Eclipse/Xdebug 无法访问/定位。一旦我删除该书签,一切都会恢复正常。

如果是这种情况,那么只需删除所有书签。

于 2015-05-22T18:08:58.510 回答