打破在Xdebug的性能变化(Break on property change in Xdebug)

2019-07-20 00:17发布

我试图找出一个特定对象的特定属性,都会修改。 由于PHP的高度动态性( $o->$prop = $val和这样),这是几乎不可能通过简单的代码分析做。 是否有一个地方开始属性,都会修改在该行调试会话和休息方式吗? (添加魔法__set与条件xdebug_break()调用的类简单的情况下可能有帮助,但如果该类或它的一个祖先已经拥有了神奇的制定者,它可以变得很复杂,所以这不是一个好的解决方案。 )

Answer 1:

根据该Xdebug的文档,它好像应该是打破对变量变化的一种方式。 http://xdebug.org/docs-dbgp.php#breakpoints

观看:在由表达式参数定义的变量或地址的写入打破

但源代码表示文件是其实际功能领先: https://github.com/xdebug/xdebug/blob/master/xdebug_handler_dbgp.c#L875

if (strcmp(CMD_OPTION('t'), "watch") == 0) {
        RETURN_RESULT(XG(status), XG(reason), XDEBUG_ERROR_BREAKPOINT_TYPE_NOT_SUPPORTED);
    }

我本来就不是能找到字符串“手表”的回购其他地方,所以我的假设是,它是当前不支持。

似乎有在Xdebug的的bug跟踪系统的bug:

http://bugs.xdebug.org/view.php?id=514



Answer 2:

声明:您要调试的财产private ,并创建一个__set方法。 里面的那个,你就可以找到答案。

class subject extends something {
    private $field;

    public function __set($key, $value) {
        if ($key == 'field') {
            debug_print_backtrace(); exit;
        }

        if (method_exists(get_parent_class($this), '__set')) {
            return parent::__set($key, $value);
        }

        return $this->$key = $value;
    }
}

编辑:这是一个getter和setter的另一个惊人的原因:)



文章来源: Break on property change in Xdebug
标签: php xdebug