【问题标题】:Fetch the function return value in PHP extension C++在 PHP 扩展 C++ 中获取函数返回值
【发布时间】:2019-04-22 21:33:45
【问题描述】:

我在 c++ 中创建了一个 php 扩展,它跟踪每个请求的调用图(centos7-64 位,PHP5.6)。现在,我想获取每个请求的函数 返回值功能。 可以通过使用zend_excute_data结构(original_return_value)来完成。

 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 扩展程序崩溃了。 这是正确的做法吗?或其他任何东西。

【问题讨论】:

  • 我也尝试了 EG(return_value_ptr_ptr) 全局,但还是没有。

标签: php php-extension php-internals


【解决方案1】:
zval *rvalue = *(data->original_return_value);    // crashing here

这是因为 original_return_value 的最后一个 deref。 数据对象或 original_return_value 未初始化或损坏的内存。

【讨论】:

  • 数据对象有值。可能是 original_return_value 指向损坏的内存。除此之外,我怎样才能得到函数的返回值?
【解决方案2】:

我终于明白了。

zval **return_value_ptr = &EX_TMP_VAR(execute_data, execute_data->opline->result.var)->var.ptr;

return_value_ptr 是当前执行函数的返回值。

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多