2
LinuxでPHP 5.4.0を実行しています。モジュールがそのMSHUTDOWNを終了したときにここ PHPモジュールがts_allocate_dtorでクラッシュする
は、ZEND_MINIT_FUNCTION
#ifdef ZTS
ts_allocate_id(&sample_globals_id,
sizeof(zend_sample_globals),
(ts_allocate_ctor) php_sample_init_globals,
(ts_allocate_dtor) php_sample_destroy_globals);
#else
php_sample_init_globals(& sample_globals TSRMLS_CC);
#endif
このコードがクラッシュのコードです。 TSRM.c、この行(デストラクタの呼び出し)にGDBポイント:
if (p->storage[j]) {
if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) {
resource_types_table[j].dtor(p->storage[j], &p->storage);
}
free(p->storage[j]);
}
でも見知らぬ人、私はNULLとデストラクタ関数を交換するとき、それは動作します。このように:
ts_allocate_id(&sample_globals_id,
sizeof(zend_sample_globals),
(ts_allocate_ctor) php_sample_init_globals,
NULL); //Works, but destructor is not called
これはどうして起こるのでしょうか? ありがとうございます
どのような形式のクラッシュですか?これは二重自由であるかもしれませんか? –
私はそうは思わない、デストラクタphp_sample_destroy_globals()が空であってもクラッシュする。 クラッシュはセグメンテーションエラー – Vasisualiy
ですが、実際にはこのケースと非常によく似ています http://osdir.com/ml/php.pecl.devel/2007-03/msg00036.html – Vasisualiy