PHP调试器无法在断点处停止:Eclipse和Xdebug

11

客户端工具:(没有Apache,没有PHP)


Eclipse for PHP Developers

版本:Oxygen.2 Release(4.7.2)

构建ID:20171218-0600

Redhat Enterprise Linux 6.9

java version "1.8.0_101"

Java(TM) SE Runtime Environment(build 1.8.0_101-b13)

Java HotSpot(TM) 64-Bit Server VM(build 25.101-b13, mixed mode)


PHP Web应用所在的远程服务器:


PHP 5.6.5

Zend Engine v2.6.0,版权所有(c)1998-2014 Zend Technologies

使用Zend OPcache v7.0.4-dev,版权所有(c)1999-2014,由Zend Technologies提供支持

使用Xdebug v2.2.7,版权所有(c)2002-2015,由Derick Rethans提供支持


我找到了以前关于这个问题的帖子。我不理解尝试的所有方法。我尝试了我能理解的内容,但没有成功。主要是使用xdebug_break();(再次尝试不成功)


我正在使用Eclipse和Xdebug调试一个远程的PHP网站。我的问题是我无法让调试器停在我设置的断点上。

我使用Eclipse和"同步PHP项目"进行远程PHP开发。我的电脑上除了Eclipse之外没有其他运行程序。

我在通过Eclipse使用远程服务器上的Xdebug调试器。

当我使用调试器时,它会跳到index.php。我可以一步步执行并查看变量值。

问题是Xdebug不会停在我设置的任何断点处。

我包括了我的Xdebug设置。

任何有关如何找到和解决问题的线索都将受到欢迎。

Xdebug设置:


xdebug support,enabled
Version,2.2.7

DBGp - Common DeBuGger Protocol,$Revision: 1.145 $

Directive,Local Value,Master Value

xdebug.auto_trace,Off,Off
xdebug.cli_color,0,0
xdebug.collect_assignments,Off,Off

xdebug.collect_includes,On,On

xdebug.collect_params,0,0
xdebug.collect_return,Off,Off
xdebug.collect_vars,Off,Off

xdebug.coverage_enable,On,On
xdebug.default_enable,On,On

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.extended_info,On,On

xdebug.file_link_format,no value,no value

xdebug.max_nesting_level,100,100
xdebug.overload_var_dump,On,On

xdebug.profiler_aggregate,Off,Off
xdebug.profiler_append,Off,Off
xdebug.profiler_enable,Off,Off

xdebug.profiler_enable_trigger,On,On
xdebug.profiler_output_dir,/tmp,/tmp
xdebug.profiler_output_name,cachegrind.out.%t.%s,cachegrind.out.%t.%s

xdebug.remote_autostart,Off,Off

xdebug.remote_connect_back,On,On
xdebug.remote_cookie_expire_time,3600,3600
xdebug.remote_enable,On,On
xdebug.remote_handler,dbgp,dbgp
xdebug.remote_host,127.0.0.1,127.0.0.1
xdebug.remote_log,/var/log/xdebug/xdebug.log,/var/log/xdebug/xdebug.log
xdebug.remote_mode,req,req
xdebug.remote_port,9000,9000

xdebug.scream,Off,Off
xdebug.show_exception_trace,Off,Off
xdebug.show_local_vars,Off,Off
xdebug.show_mem_delta,Off,Off
xdebug.trace_enable_trigger,Off,Off

xdebug.trace_format,0,0
xdebug.trace_options,0,0
xdebug.trace_output_dir,/tmp,/tmp
xdebug.trace_output_name,trace.%c,trace.%c
xdebug.var_display_max_children,128,128
xdebug.var_display_max_data,512,512
xdebug.var_display_max_depth,3,3

编辑

我创建了一个屏幕截图相册。

第一张是来自Eclipse的错误消息,当我整夜离开它时就会出现。

其余的屏幕截图是按顺序排列的(从上到下),显示了我的phpinfo输出中的各个部分。

https://imgur.com/a/9DKev

我的phpinfo()输出中没有Zend部分,但有以下变量。

report_zend_debug = on
zend.detect_unicode On
zend.enable_gc  On
zend.multibyte  Off 
zend.script_encoding = no value

@kerbholz认为这是标题的问题,因为后面它确实说它不会在断点处停止。 - Nigel Ren
@Steve,虽然我写的文章是关于Docker的,但同样的方法也适用于普通服务器。你可以看一下这个链接:http://tarunlalwani.com/post/debugging-php-xdebug-docker/ - Tarun Lalwani
4个回答

7
根据您的描述,情况似乎是这样的:
  • 与远程服务器的调试连接正常工作
  • 断点在index.php上有效,但在其他地方无效
我猜测本地和服务器之间的文件映射无法正常工作,更准确地说是Eclipse不能将您的文件映射到服务器上的文件。
要解决这个问题,您需要在Eclipse项目的运行/调试设置中设置路径映射设置。
请按以下步骤操作:
  1. 从菜单中选择“项目”->“属性”
  2. 选择“运行/调试设置”
  3. 编辑启动配置设置
  4. 在“Server”选项卡,“PHP server”部分中,选择配置
  5. 打开“PHP Server”窗口,选择路径映射选项卡
  6. 服务器上的路径设置为您的项目在服务器上的路径,将本地路径设置为您的本地路径。

enter image description here


我从一开始就有那个设置。我尝试了本地路径,包括“路径”选项和“来自工作区的路径”选项。无论哪种方式都不行。 - Steve
本地路径 /export/abc/jsmith/Projects/XYZ/Workspace/xyzdev_remote - Steve
你的项目在本地电脑上是否使用了NFS挂载,指向服务器项目文件夹? - Jannes Botis
不,我的本地电脑和服务器完全没有连接。我在Eclipse工作区中有项目文件的副本。 - Steve
让我们在聊天中继续这个讨论 - Jannes Botis
显示剩余9条评论

4
如果您按照以下步骤进行,我认为它应该能够正常工作。
最新的XDebug版本
根据https://xdebug.org/,您的XDebug版本是从2015年的。因此,您应该升级到最新版本。
设置XDebug配置
在您的系统中,根据存在的情况,在/usr/local/etc/php/conf.d//etc/php/conf.d/etc/php/5.6/cli/conf.d中设置一个99-xdebug.ini
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_handler=dbgp
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_log=/tmp/xdebug.log

创建SSH调试隧道
从您想要进行调试的机器开始,您需要使用以下命令启动一个SSH隧道:
ssh -R 127.0.0.1:9000:127.0.0.1:9000 -p 22 <user>@<phpserver>

在Eclipse中配置远程路径映射

配置Eclipse以便在9000端口上进行调试和远程路径,现在它应该可以正常工作了


0
我正在使用Eclipse和“同步PHP项目”进行远程PHP开发。除了Eclipse之外,我的计算机上没有运行任何其他程序。
这是您的问题。您必须允许xDebug连接。xDebug(PHP Web服务器)正在尝试连接,但可能不知道您在哪里 ;)
有两个选项:
  1. 如果您不在NAT后面或与测试服务器处于同一网络中,则必须在您的PC上打开端口9000。如果您在NAT后面,则还需要转发端口9000(这是默认设置,可以更改)。接下来设置正确的"xdebug.remote_host=your_public_ip"xdebug.remote_connect_back = on。还应该启用从任何主机接受远程会话(JIT)(首选项-> PHP->调试->调试器-> xDebug),之后您将能够通过浏览器扩展程序(如xDebug helper)轻松运行调试器。

  2. 配置调试器启动配置(“调试”图标后面的小箭头),以通过SSH隧道进行调试。在这种情况下,xdebug.remote_host=127.0.0.1将是正确的。注意:ssh服务器主机必须与服务器域相同,并且SSH服务器必须在端口22上可用


完整的定义可以在维基上找到,简而言之,您的公共IP地址(在互联网上可见)与分配给您的网络卡(电缆或WIFI)的IP不同。通常,您的本地IP是192.162.0-255.2-255。公共IP(您在网络上可见的方式)可以在此处找到:http://whatismyip.com/,您可以在Windows / Linux / Mac网络首选项中找到私有IP。 - zulus
请使用公共地址和端口9000访问https://www.yougetsignal.com/tools/open-ports/。必须打开Eclipse。如果启用connect_back,则忽略remote_host。 - zulus
我创建了一个屏幕截图相册。第一张是Eclipse的错误消息,当我整晚都让它开着时会出现。其余的屏幕截图是我的phpinfo输出的片段,按顺序排列(从上到下)。https://imgur.com/a/9DKev - Steve
这个弹出窗口来自Zend Debugger,但您正在尝试运行xDebug。请确保您的“调试器”选项卡“xDebug”在“weblaunch配置”中可见。 - zulus
我会准备测试远程机器并告诉你。也许是PDT或者甚至是xDebug 2.2.7上的一个bug。顺便问一下,你在Eclipse PHP服务器配置中正确设置了路径映射吗? - zulus
显示剩余6条评论

0

尝试禁用诸如opcache、zend优化器等所有与解释php代码相关的扩展。如果幸运的话,它开始工作了,请使xdebug.so最后加载,在所有其他模块之后,这样您就可以重新启用它们。将xdebug.so放在所有其他php.so所在的文件夹中,并在php ini的最后一行使用完整路径来加载它

如果您只是将其放在php.ini的最后一行,那么某些不兼容的模块可能会在之后加载,带有/etc/php/5.6/apache2/conf.d/*的配置。因此,只需将配置文件移动到其他地方一段时间。

在链接的帖子底部,我完全禁用(但不通过apt删除)opchache模块,并将其放置在php.ini中,调试器前1行。

检查phpinfo()输出中扩展名的加载顺序,即zend徽标左侧,因为我记得。调试器必须是该输出块中的最后一行。发布您的phpinfo(); 输出。

另一种方法,我自己走的路:(我建议这样做)

如果您有远程服务器的root访问权限,请尝试使用Zend Debugger。它与Zend Studio捆绑在一起(非免费),但是对于某些php版本,有单独的调试器下载,5.6是最新版本可用的。他们没有发布php7的版本,无论如何我不知道是否可以从试用版Zend Studio中复制它。如果已删除且无法下载,则我可以将其发送给您。
现在,Zend debugger更适合php,而Zend团队参与了Eclipse PDT开发(但他们意识到付费版本具有最美味的功能)
我有与您类似的环境,也遇到了XDebug的问题,然后决定将其删除并尝试Zend debugger。这是我的问题和答案,关于安装和修复问题:https://askubuntu.com/questions/1002252/installing-configuring-zend-debugger-for-eclipse-pdt 简而言之,解决方案是:

在配置文件中注释掉它:(cli版本似乎是符号链接,因此也被禁用)

lenya@JabbaDesktop:~$ sudo nano /etc/php/5.6/apache2/conf.d/10-opcache.ini

; configuration for php opcache module
; priority=10
; zend_extension=opcache.so

在/etc/php/5.6/apache2/php.ini文件的底部:
[Zend]
zend_extension="/usr/lib/php/20131226/opcache.so"
zend_extension="/usr/lib/php/20131226/ZendDebugger.so"
zend_debugger.allow_hosts=127.0.0.0/8,192.168.0.0/16
zend_debugger.expose_remotely=1
zend_debugger.connector_port=10137

第一和第二行(.so)必须严格按照这个顺序。在谷歌中可以轻松找到安装调试器的“如何”教程。上面没有人提到过这个问题。
更新:
当我使用调试器时,它会跳转到index.php。我可以逐步执行一段时间并查看变量的值。
这意味着您已经连接到服务器,问题不在那里。

是的,那很好,但我需要更多,更多 :) 图形化数据库设计集成到Eclipse中,并为ExtJS和JQuery提供代码提示等等 :) 是否可以从试用版中削减插件? - LeonidMew
尝试使用市场上提供的dbeaver。它支持许多数据库。Zend Studio使用旧版JSDT进行js开发,当前版本效果不佳,因此我暂时无法推荐替代方案。 - zulus
尽管存在这些变量,但我的phpinfo()输出中没有Zend部分:report_zend_debug = on zend.detect_unicode On zend.enable_gc On zend.multibyte Off zend.script_encoding = no value - Steve
@Steve,错误信息显示你的xdebug版本有误,你应该安装正确的版本。或者尝试使用Zend调试器 :) 第二屏幕上有Zend引擎部分,其中包括opcache和xdebug。尝试暂时禁用opcache,但首先要安装正确的xdebug版本。 - LeonidMew
@Steve,我刚刚读了你的所有评论,所以你没有root访问权限,但是有系统管理员:) 告诉他xdebug版本与php版本不兼容,请安装正确的版本。不是最新版本,而是完全兼容的版本。你有连接,因为在步进时能够看到变量,尝试不使用ssh,因为它不起作用,但稍后你应该加密流量。 - LeonidMew
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接