我已经在c ++中创建了一个php扩展,可以跟踪每个请求的调用图(centos7-64位,PHP5.6)。现在,我想获取每个请求的功能返回值功能。 可以使用zend_excute_data结构(原始_返回值)来完成。
zend_execute_data *data;
data = EG(current_execute_data);
if(data->original_return_value)
{
zval *rvalue = *(data->original_return_value); // crashing here
switch (Z_TYPE(argument_element))
{
..
..
..
}
}
在这里,在将original_return_value分配给rvalue时,我的php扩展崩溃了。 这是正确的方法吗?或其他任何东西。
答案 0 :(得分:0)
zval *rvalue = *(data->original_return_value); // crashing here
这是因为original_return_value
的最后一个deref。
数据对象或original_return_value未初始化或损坏的内存。
答案 1 :(得分:0)
最后我明白了。
zval **return_value_ptr = &EX_TMP_VAR(execute_data, execute_data->opline->result.var)->var.ptr;
return_value_ptr具有当前执行函数的返回值。