2012-03-06 187 views
0

我寫了一個簡單的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... 

任何人有任何想法,爲什麼這可能發生?
謝謝!

回答

1

zend_hash_find()的用法是正確的,我在生產中使用它的方式沒有任何問題。 gdb消息說散列表(function_table)是NULL,所以我猜想問題在於你的模塊的初始化。如果粘貼完整的源代碼,我們可以幫助:-)

BTW estrndup是不是在你的情況

+0

此代碼是在PHP_MINIT階段運行的必要。有沒有可能,那function_table還沒有初始化? – Vasisualiy 2012-03-07 10:11:07

+0

你可以使用CG(function_table)而不是EG(function_table)來測試嗎? – strkol 2012-03-07 11:35:10

+0

它適用於CG。爲什麼? – Vasisualiy 2012-03-07 14:34:39