2012-03-06 23 views
0

私は簡単なPHPモジュールを作成し、zend_hash_find()関数を実行しようとしました。しかし、私は奇妙なsegfaultメッセージを取得しています。 (VMの下で)CentOSに6.2の64ビット上で実行
は、PHP 5.4.0はここ zend_hash_find()の実行中にセグメンテーションが失敗しました

は、関数である(だけでなく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); 

"Before find"というメッセージが表示され、次にコアダンプが表示されます。ここに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

:-)役立つかもしれません。このコードはPHP_MINIT段階で実行されているあなたのケース

+0

には必要ありません。 function_tableがまだ初期化されていない可能性はありますか? – Vasisualiy

+0

EG(function_table)の代わりにCG(function_table)でテストできますか? – strkol

+0

CGで動作します。どうして? – Vasisualiy

関連する問題