运行zend_hash_find()时出现分段错误

时间:2012-03-06 20:37:24

标签: php gdb coredump

我编写了一个简单的php模块并尝试运行zend_hash_find()函数。但是我得到了一个奇怪的段错误信息 运行在Centos 6.2 64bit(在VM下),php 5.4.0(也发生在5.3.3上)

这是功能:

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);

我看到"在找到"消息,然后是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...

任何人都知道为什么会发生这种情况? 谢谢!

1 个答案:

答案 0 :(得分:1)

zend_hash_find()的用法是正确的,我在生产中使用它的方式没有任何问题。 gdb消息说哈希表(function_table)是NULL,所以我认为问题在于模块的初始化。如果您粘贴完整的源代码,我们可能会提供帮助: - )

在你的情况下不需要BTW estrndup