ホームページ  >  記事  >  バックエンド開発  >  [php カーネルのバグ] 動的リンクでコンパイルされた拡張機能により、グローバル空間 dtor が拡張されてコアダンプが発生する_PHP チュートリアル

[php カーネルのバグ] 動的リンクでコンパイルされた拡張機能により、グローバル空間 dtor が拡張されてコアダンプが発生する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:08:01897ブラウズ

著者: goosman.lei(雷國国)

ブログ: http://blog.csdn.net/lgg201
メール: lgg860911@yahoo.com.cn
関連するコードについては、書籍「php の拡​​張と埋め込み」の第 12 章「拡張グローバル」セクションを参照してください。
拡張機能を登録するためのグローバル空間コードは次のとおりです:
#ifdef ZTS
ts_allocate_id(&sample_globals_id, sizeof(zend_sample_globals), (ts_allocate_ctor)ZEND_MODULE_GLOBALS_CTOR_N(サンプル), (ts_allocate_dtor)ZEND_MODULE_GLOBALS_DTOR_N(サンプル));
#else
sample_globals_ctor(&sample_globals TSRMLS_CC);
#endif
ts_allocate_id() 関数呼び出しでは、レコードが resource_types_table 配列に書き込まれます。
tsrm_shutdown()の処理中に、登録されたdtorコールバック関数が呼び出されます。
しかし、本に従ってコーディングを終えた後、テストコードを実行するとコアダンプが発生します。
追跡の結果、zend_shutdown()の呼び出しプロセス中にモジュールでDL_UNLOAD(module->handle)が呼び出され、tsrm_shutdown()の実行時にその時点で登録されたハンドル(dtor)にアクセスできなくなることが判明しました。 ).
同時に、この登録方法は標準拡張子の ext/standard/file.c でも使用されていることがわかりました。ただし、静的にコンパイルされる必要があるため、問題はありません。また、私の拡張子は、動的にコンパイルされています。リンクされました。
以下は、zend_shutdown() から DL_UNLOAD() までのトレース パスです。
zend_shutdown() => zend_desctroy_modules() => zend_hash_apply_deleter() =>

http://www.bkjia.com/PHPjc/477806.html

tru​​ehttp://www.bkjia.com/PHPjc/477806.html技術記事著者: goosman.lei (Lei Guoguo) ブログ: http://blog.csdn.net/lgg201 メール: lgg860911@yahoo.com.cn 関連するコードについては、書籍「php の拡​​張と埋め込み」の第 12 章、「拡張」セクションを参照してください。グローバル ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。