打破Xdebug的财产变化

Tgr*_*Tgr 5 php xdebug

我试图找出某个对象的某个属性被修改的位置.由于PHP的高度动态性($o->$prop = $val等等),通过简单的代码分析几乎不可能做到这一点.有没有办法启动调试会话并在属性被修改的行中断?(__set通过条件xdebug_break()调用向类添加魔法可能有助于简单的情况,但如果类或其中一个祖先已经有魔术设置器,它可能变得非常复杂,因此这也不是一个好的解决方案.)

Mix*_*gic 10

根据xdebug文档,似乎应该有一种方法来打破变量. http://xdebug.org/docs-dbgp.php#breakpoints

watch:在写入由expression参数定义的变量或地址时中断

但是源代码表明文档超出了它的实际功能: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);
    }
Run Code Online (Sandbox Code Playgroud)

我实际上无法在回购中的任何其他地方找到字符串'watch',所以我的假设是它目前不受支持.

Xdebug的bug跟踪器中似乎存在错误:

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


Col*_*n M 5

声明您尝试调试的属性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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是吸气剂和制定者的另一个惊人原因:)