已经为PHP 5写了C延期,现在将其升级到PHP 7。
我根据Zend Framework的新需求修改了所有API调用,以便代码编译。将我的.SO文件放置在扩展位置,而PHP-FPM服务开始操作。
基本上,我从我的C扩展中请求自定义的标签(旧版代码),将其转换为ZVAL并在PHP中使用,然后随着范围结束,应调用其驱动器,但这里存在OME问题,我们在这里有问题,我们请参阅分段故障。
这是我的代码C-文件:
static int le_myResource;
#define le_myResource_name "a myResource resource"
void myResource_destruction_handler(zval *rsrc TSRMLS_DC)
{
myResource *d = (myResource *)zend_fetch_resource(Z_RES_P(rsrc), le_myResource_name, le_myResource);
myResource_free(d);
}
rsrc_dtor_func_t myResource_destruction_handler;
le_myResource = zend_register_list_destructors_ex(myResource_destruction_handler, NULL, le_myResource_name, module_number);
ZEND_FUNCTION(myhash_new)
{
myResource *d;
d = myHash_new(); // my legacy project code returning a hash. The same way it returned to php5
RETURN_RES(zend_register_resource(d, le_myResource));
}
这是调用PHP文件
<?php
class dbd {
function query()
{
$reply = myhash_new()
// use $reply
// print statement here works
}// this is where the problem occurs
}
?>
GDB堆栈显示以下内容:
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `php-fpm: pool www '.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000900000000 in ?? ()
Missing separate debuginfos, use: debuginfo-install ironwood-php-7.2.3.bfeature.B.88927_upgrade_to_php7-r20180313172814.9f25293.bLOCAL.x86_64
(gdb) bt
#0 0x0000000900000000 in ?? ()
#1 0x000000170000003e in ?? ()
#2 0x0000000001fb3250 in ?? ()
#3 0x0000000000000003 in ?? ()
#4 0x00007fbbff29e160 in ?? ()
#5 0x000000000079f8fa in list_entry_destructor ()
#6 0x00000000007971ba in zend_hash_index_del ()
#7 0x000000000084168f in zend_leave_helper_SPEC ()
#8 0x00000000007d4228 in execute_ex ()
#9 0x0000000000841327 in zend_execute ()
#10 0x0000000000787094 in zend_execute_scripts ()
#11 0x000000000071300e in php_execute_script ()
#12 0x000000000084ebfe in main ()
不确定如何控制第三方库生成的内存,然后避免被损坏。同一作品与PHP5一起使用。在www上进行了很多扫描,但无法破解它。任何指针都会有所帮助。
找到了问题。这是因为使用 rsrc_dtor_func_t 用于我的destructor函数。当我没有使用上述关键字时,我早些时候就有编译问题。
也在myResource_destruction_handler中替换为zend_resource* ,然后将函数更改为 static void myResource_deStruction_handler(),以解决我所有问题。
到目前为止,我还没有遇到破坏级别的崩溃。