2012-03-06 2 views
0

Я написал простой php-модуль и попытаюсь запустить функцию zend_hash_find(). Но я получаю странное сообщение segfault.
Бег на Centos 6.2 64bit (Under 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); 

Я вижу сообщение «Перед тем, как найти», затем 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

+0

Можете ли вы протестировать CG (function_table) вместо EG (function_table)? – strkol

+0

Он работает с CG. Зачем? – Vasisualiy

Смежные вопросы