Xdebug 在访问类静态属性时中断

2022-08-30 23:40:42

我在开发环境中遇到了Xdebug的问题。

FROM library/php:5.5-apache

RUN apt-get -qqy update && apt-get -qqy install \ 
               libpq-dev \
               libmcrypt-dev \
               libxml2-dev \
               ssl-cert \
               vim \
               git \
               mc \
        && rm -r /var/lib/apt/lists/*

# compile and add xdebug
RUN pecl install xdebug \
    && echo "zend_extension=xdebug.so" >> "/usr/local/etc/php/conf.d/xdebug.ini"

# configure apache and vhosts
RUN a2enmod rewrite ssl \
        && a2ensite 000-default default-ssl

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_PID_FILE /var/run/apache2/apache2.pid
ENV APACHE_LOCK_DIR /var/lock/apache2

CMD ["apache2-foreground"]

Xdebug 设置:

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=0
xdebug.remote_host=172.17.42.1
xdebug.remote_port=9000

一切都很好,但有一件事。调试代码时:

<?php
class A {
    static private $a;

    static public function init() {
        self::$a = 123;
    }
}

A::init();

如果我设置断点或单步执行该行,我得到:self::$a = 123;

Fatal error: Access to undeclared static property: A::$a

如果我不单步执行该行,调试会话将继续进行,没有任何问题。

怎么了?


答案 1

我认为这是XDebug中某个地方的错误 - 请参阅这些错误报告

同时,您可以通过在引发异常的行之后使用函数来解决此问题,并从那里继续调试。我尝试在引发异常后在行上设置断点,发现断点不足以阻止它引发异常。xdebug_break()

这不是一个完美的解决方案,但希望这些错误能很快得到解决。

更新:问题已经确定为特定版本的PHP与特定版本的Xdebug和用于某些图像的特定编译器的组合。Docker 库 bug 报告中提出了一个潜在的解决方案,如果您使用的是 Docker,则涉及安装这些包的特定版本。

FROM php:5.6.3-apache

# XDebug
RUN yes | pecl install xdebug \
    && yes | apt-get update \
    && yes | apt-get install php5-xdebug \
    && echo "zend_extension=/usr/lib/php5/20131226/xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
      && echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini

答案 2

所描述的错误只能在官方 PHP5 镜像中重现。PHP 7 映像工作正常,当从 jessie 或 ubuntu 构建自定义 PHP5 FPM 映像时,也不会发生错误。


推荐