在PHP扩展C ++中获取函数返回值

时间:2018-11-20 12:29:32

标签: php php-extension php-internals

我已经在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扩展崩溃了。 这是正确的方法吗?或其他任何东西。

2 个答案:

答案 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具有当前执行函数的返回值。