运行时出现分段错误zend_hash_find()
问题描述:
我写了一个简单的php模块,并尝试运行zend_hash_find()函数。但是我收到了一条奇怪的段落错误消息。
运行在CentOS 6.2 64位(在VM),PHP 5.4.0(发生在5.3.3以及)运行时出现分段错误zend_hash_find()
下面是函数:
void my_func(const char *fname,int fname_len TSRMLS_DC){
void *func;
char *funcname = estrndup(fname , fname_len) ;
php_printf("Before find\n");
if (zend_hash_find(EG(function_table), funcname, fname_len + 1, (void **) &func) == FAILURE)
php_printf("not found");
php_printf("after find \n");
efree(funcname);
}
这是函数是如何被调用
my_func("fopen",5 TSRMLS_CC);
我看到“Before find”消息,然后coredump。下面是GDB消息
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /usr/lib64/php/modules/mymod.so...done.
Loaded symbols for /usr/lib64/php/modules/mymod.so
Core was generated by `php test.php'.
Program terminated with signal 11, Segmentation fault.
#0 0x000000000083457d in _zend_is_inconsistent (ht=0x0,
file=0xcd2b68 "/home/user/php/php-5.4.0/Zend/zend_hash.c", line=919)
at /home/user/php/php-5.4.0/Zend/zend_hash.c:54
54 if (ht->inconsistent==HT_OK) {
...skipped...
任何人有任何想法,为什么这可能发生?
谢谢!
答
zend_hash_find()的用法是正确的,我在生产中使用它的方式没有任何问题。 gdb消息说散列表(function_table)是NULL,所以我猜想问题在于你的模块的初始化。如果粘贴完整的源代码,我们可以帮助:-)
BTW estrndup是不是在你的情况
此代码是在PHP_MINIT阶段运行的必要。有没有可能,那function_table还没有初始化? – Vasisualiy 2012-03-07 10:11:07
你可以使用CG(function_table)而不是EG(function_table)来测试吗? – strkol 2012-03-07 11:35:10
它适用于CG。为什么? – Vasisualiy 2012-03-07 14:34:39