【问题标题】:PHP Debugger will not stop at breakpoints: Eclipse & XdebugPHP 调试器不会在断点处停止:Eclipse 和 Xdebug
【发布时间】:2018-07-23 01:09:26
【问题描述】:

客户端工具:(无 Apache,无 PHP)


面向 PHP 开发人员的 Eclipse

版本:Oxygen.2 版本 (4.7.2)

版本号:20171218-0600

红帽企业 Linux 6.9

java 版本“1.8.0_101”

Java(TM) SE 运行时环境(内部版本 1.8.0_101-b13)

Java HotSpot(TM) 64 位服务器 VM(内部版本 25.101-b13,混合模式)


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 认为这是标题的问题,因为稍后它确实说它不会在断点处停止。
  • @Steve,虽然我写的文章是针对 docker 的,但同样的事情也适用于普通服务器。看看tarunlalwani.com/post/debugging-php-xdebug-docker

标签: php eclipse debugging xdebug breakpoints


【解决方案1】:

从你的描述看来:

  • 与远程服务器的调试连接正在工作
  • 断点适用于 index.php,但不适用于其他任何地方

我的假设是本地代码和服务器代码之间的文件映射不起作用,更准确地说,eclipse 无法将您的文件映射到服务器。

要解决这个问题,您必须在 eclipse 项目的 run/debug settings 中设置 path mapping 设置。

转到:

  1. 项目 -> 菜单中的属性
  2. 选择运行/调试设置
  3. 编辑您的启动配置设置
  4. 在服务器选项卡的 PHP 服务器 部分,选择 configure
  5. “PHP Server”窗口打开,选择路径映射选项卡
  6. Path on server 设置为您的项目在服务器上的路径,并将 Local path 设置为很好,这是不言自明的。

【讨论】:

  • 我从一开始就有这个设置。我尝试了“路径”选项和“来自工作区的路径”选项的本地路径。两种方式都没有骰子。
  • 你能发布设置的路径以及断点不起作用的 php 文件的路径吗?
  • 服务器路径:/home/jsmith/public_html/xyz
  • 本地路径/export/abc/jsmith/Projects/XYZ/Workspace/xyzdev_remote
  • 断点不起作用的 PHP 文件的路径:/export/abc/jsmith/Projects/XYZ/Workspace/xyzdev_remote/lib/xyz/db_classes/display.php
【解决方案2】:

如果您按照以下步骤操作,我认为它应该可以工作

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 中配置远程路径映射

为端口 9000 和远程路径上的调试配置 eclipse,现在它应该可以工作了

【讨论】:

    【解决方案3】:

    我正在使用 Eclipse 和“同步 PHP 项目”进行远程 PHP 开发。除了 Eclipse 之外,我的计算机上没有运行任何东西。

    这是你的问题。您必须允许 xDebug 连接。 xDebug (PHP Web Server) 尝试连接但可能不知道你在哪里;)

    有两种选择:

    1. 如果您不在 NAT 之后或与测试服务器不在同一网络中,则必须在 PC 上打开端口 9000。如果您在 NAT 之后,您还需要转发端口 9000(这是默认值,可以更改)。接下来设置正确的"xdebug.remote_host=your_public_ip"xdebug.remote_connect_back = on。启用从任何​​主机(Preferences -> PHP -> Debug -> Debuggers -> xDebug)接受远程会话(JIT)也很好,之后您将能够通过浏览器扩展(如 xDebug helper)轻松运行调试器。

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

    【讨论】:

    • 什么是 NAT,我如何判断我是否落后于 NAT?
    • 您可以在 wiki 上找到完整的定义,简而言之,您的公共 IP 地址(在 Internet 上可见)与分配给您的网卡(电缆或 WIFI)的 IP 不同。通常您的本地 IP 是 192.162.0-255.2-255。公共 IP(您在网络上的可见性)您可以在这里找到:whatismyip.com,私有 IP 您可以在 windows/linux/mac 网络首选项中找到。
    • 我的公网 IP 是 140.90.100.199。通过 ifconfig 我的 inet addrr 是 10.90.195.104。我的本地环回 inet 地址是 127.0.0.1。我如何知道我的 9000 端口是打开还是关闭?我的 xdebug.remote_connect_back = on 我需要离开 xdebug.remote_host = xdebug.remote_host,127.0.0.1,127.0.0.1
    • yougetsignal.com/tools/open-ports 使用公共地址和端口 9000。必须打开 Eclipse。如果启用了 connect_back,则忽略 remote_host。
    • 我尝试在调试配置中使用 SSH 隧道。当我点击“测试连接”按钮时,我得到“已连接警告”,警告是“调试器隧道可能尚未初始化。然后出现一个空白的灰色窗口。
    【解决方案4】:

    尝试禁用以下功能:opcache、zend 优化器等,所有可用于解释 php 代码的扩展。如果你运气好并且它开始工作,那么在所有其他模块之后,让 xdebug.so 最后加载,这样你就可以再次重新启用它们。将 xdebug.so 放在所有其他 php .so 所在的文件夹中,并将其加载到 php ini 的最后一行,并带有 full path 到 xdebug.so

    如果你只是把它放在最后一行 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 工作室复制它。如果删除了,无法下载,我可以发给你。

    Zend 调试器现在更原生于 php,并且 Zend 团队参与了 Eclipse PDT 开发(但他们在付费版本中实现了最有品味的功能)

    我有和你类似的环境,也有 XDebug 的问题,然后决定删除它并尝试 Zend 调试器。在 askubuntu 上有我的问答,关于安装和修复问题: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)应该完全按照这个顺序。 安装调试器“如何”很容易在 google 中找到。没有人提到上述问题。

    更新:

    当我使用调试器时,它会转到 index.php。我可以单步调试一下,看看变量的值。

    这意味着你已经连接到服务器,问题不存在

    【讨论】:

    • 还有一件事要提一下,我没有用pecl安装东西,都是手动完成的,这样你就知道会发生什么了。
    • Zend Studio 的大多数“付费”功能都在 PDT 中,因为 5.0(PHPUnit、验证、分析、同步项目);)
    • 是的,这很好,但我需要更多更多:) 集成到 Eclipse 的图形数据库设计,以及 ExtJS 和 JQuery 的代码提示等等 :) 是否可以从试用版中删除插件?
    • 试用 dbeaver,可在市场上购买。它支持许多数据库。 Zend studio 使用旧的 JSDT 做 js,当前版本不能正常工作,所以我暂时无法推荐替代方案。
    • 我创建了一个屏幕截图相册。第一个是来自 Eclipse 的错误消息,当我将其打开一整夜时会发生该错误消息。其余的屏幕截图是片段,按照我的 phpinfo 输出的顺序(从上到下)。 imgur.com/a/9DKev
    猜你喜欢
    • 2010-11-25
    • 2014-11-22
    • 2014-06-19
    • 2011-03-31
    • 1970-01-01
    • 2011-04-30
    • 2020-02-01
    • 2014-03-25
    • 2019-08-16
    相关资源
    最近更新 更多