Xdebug breaks on access to class static property

2019-03-18 05:56发布

问题:

I've a problem with Xdebug in my development environment.

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 settings:

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

Everything works good but one thing. When debugging the code:

<?php
class A {
    static private $a;

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

A::init();

If I set a breakpoint on self::$a = 123; or step into the line, I get:

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

If I don't step into that line, the debugging session continues without any problems.

What's wrong?

回答1:

I think it's a bug somewhere in XDebug - see these bug reports

  • http://bugs.xdebug.org/view.php?id=1185
  • https://github.com/docker-library/php/issues/133

Meanwhile you may be able to sort of work around the issue by using the xdebug_break() function just AFTER the line that's throwing the exception and continue debugging from there. I tried setting a breakpoint on the line after the exception is thrown and I found that a breakpoint wasn't enough to stop it throwing an exception.

Not a perfect solution but hopefully those bugs will get fixed soon



回答2:

The error described can only be reproduced in the official PHP5 images. PHP 7 images work just fine, and when building a custom PHP5 FPM image from jessie or ubuntu, the error also does not occur.