PHP扩展:从函数返回时的分段错误

时间:2013-12-30 09:18:13

标签: php c++ c gdb php-extension

我正在开发一个php扩展并遇到问题。在我的扩展中,我定义了一个函数,该函数从用户空间解析参数并将它们传递给静态库中的另一个函数。

但是当我的函数结束时,会弹出以下错误: “无法访问地址0x5处的内存 分段错误(核心转储)“

我尝试使用gdb解决它并打印以下帧信息:

0x0852dbe3 in zend_do_fcall_common_helper_SPEC (
    execute_data=<error reading variable: Cannot access memory at address 0xffffffc5>, 
    tsrm_ls=<error reading variable: Cannot access memory at address 0xffffffc1>) at /home/ted/php-5.5.6/Zend/zend_vm_execute.h:550

输入“info frame”命令后,会出现以下信息:

Stack level 0, frame at 0x9:
 eip = 0x852dbe3 in zend_do_fcall_common_helper_SPEC
    (/home/ted/php-5.5.6/Zend/zend_vm_execute.h:550); saved eip Cannot access memory at address 0x5

我已经坚持了一天..有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题..这是由一个我不太明白的错误(可能)引起的。在我的PHP代码中,我调用这样的函数:

$object->object_function($a,$b,$c,1);

在我的php扩展中,我解析了所有这些参数:

if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sral",&string1,&strlen1,&resource,&array1 ,&intVal)     == FAILURE)

问题是,我不能在PHP代码中使用1。相反,我应该使用:

$d = 1; 
$object->object_function($a,$b,$c,$d);

我想这是因为我对php核心的理解不足。直接将1传递到扩展函数实际上不会给出我想要的值。