0
私は簡単なPHPモジュールを作成し、zend_hash_find()関数を実行しようとしました。しかし、私は奇妙なsegfaultメッセージを取得しています。 (VMの下で)CentOSに6.2の64ビット上で実行
は、PHP 5.4.0はここ 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"というメッセージが表示され、次にコアダンプが表示されます。ここに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...
これはなぜ起こっているのでしょうか?
ありがとうございます!
には必要ありません。 function_tableがまだ初期化されていない可能性はありますか? – Vasisualiy
EG(function_table)の代わりにCG(function_table)でテストできますか? – strkol
CGで動作します。どうして? – Vasisualiy