[php核心bug]動態連結方式編譯的擴充, 擴充全域空間dtor導致core dump_PHP教程

來源:互聯網
上載者:User
author: goosman.lei(雷果國)blog: http://blog.csdn.net/lgg201mail: lgg860911@yahoo.com.cn 相關代碼可以參考一書第12章, "Extension Globals"一節. 註冊擴充的全域空間代碼如下:#ifdef ZTS ts_allocate_id(&sample_globals_id, sizeof(zend_sample_globals), (ts_allocate_ctor)ZEND_MODULE_GLOBALS_CTOR_N(sample), (ts_allocate_dtor)ZEND_MODULE_GLOBALS_DTOR_N(sample));#else sample_globals_ctor(&sample_globals TSRMLS_CC);#endif 在ts_allocate_id()函數調用中, 向resource_types_table這個數組中寫入了一條記錄.在tsrm_shutdown()的過程中, 將調用註冊的dtor回呼函數. 但是我這邊在按照書上編碼完後, 運行測試代碼會有coredump.經過跟蹤發現, 在zend_shutdown()的調用過程中, 已經對模組調用了DL_UNLOAD(module->handle); 導致當時註冊的控制代碼(dtor)在執行tsrm_shutdown()時已經不可訪問. 同時, 看到標準擴充中的ext/standard/file.c中也有這種註冊方式的使用, 不過, 它應該是靜態編譯所以沒有問題. 而我的擴充是編譯.so動態連結的. 下面是跟蹤zend_shutdown()最終到DL_UNLOAD()的調用路徑.zend_shutdown() => zend_desctroy_modules() => zend_hash_graceful_reverse_destroy() => zend_hash_apply_deleter() => module_destructor() => DL_UNLOAD()

http://www.bkjia.com/PHPjc/477806.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477806.htmlTechArticleauthor: goosman.lei(雷果國) blog: http://blog.csdn.net/lgg201 mail: lgg860911@yahoo.com.cn 相關代碼可以參考php extending and embedding一書第12章, Extension Globals一節...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.