PHP Extension を書いています。ターゲットは php-7.1.4(Zend Engine 3.1)です。質問に "Zend Engine" タグを付けようとしましたが、タグが未登録のようです(追加要望を出しておきました)。
一応必要最小限は動くようになったので、サンプルスクリプトを php で書いて実行してみましたが、以下のような表示が出ました。いずれも自作 Extension の中で eXXalloc() したものです。
bash
1Fri May 26 13:43:46 2017] Script: '/home/vagrant/temp/b.php' 2/home/vagrant/php/ext/my_ext/my_ext.c(326) : Freeing 0x00007f7dd6402fc0 (25 bytes), script=/home/vagrant/temp/b.php 3[Fri May 26 13:43:46 2017] Script: '/home/vagrant/temp/b.php' 4/home/vagrant/php/ext/my_ext/my_ext.c(256) : Freeing 0x00007f7dd6472028 (8 bytes), script=/home/vagrant/temp/b.php 5=== Total 2 memory leaks detected ===
gdb で追ってみると、PHP スクリプト的にはすでに実行が終わっていて、いわゆるクリーンアップ処理で出ているようです。
bash
11492 snprintf(memory_leak_buf, 512, "%s(%d) : Freeing " ZEND_ADDR_FMT " (%zu bytes), script=%s\n", t->filename, t->lineno, (size_t)t->addr, t->size, SAFE_FILENAME(SG(request_info).path_translated)); 2(gdb) bt 3#0 php_message_handler_for_zend (message=4, data=0x7fffffffcc60) 4 at /usr/local/src/php-7.1.4/main/main.c:1492 5#1 0x00000000008520b4 in zend_message_dispatcher (message=4, 6 data=0x7fffffffcc60) at /usr/local/src/php-7.1.4/Zend/zend.c:1030 7#2 0x000000000081c181 in zend_mm_check_leaks (heap=0x7ffff5e00040) 8 at /usr/local/src/php-7.1.4/Zend/zend_alloc.c:2096 9#3 0x000000000081c4b9 in zend_mm_shutdown (heap=0x7ffff5e00040, full=0, 10 silent=0) at /usr/local/src/php-7.1.4/Zend/zend_alloc.c:2168 11#4 0x000000000081d20f in shutdown_memory_manager (silent=0, full_shutdown=0) 12 at /usr/local/src/php-7.1.4/Zend/zend_alloc.c:2591 13#5 0x00000000007c1b28 in php_request_shutdown (dummy=0x0) 14 at /usr/local/src/php-7.1.4/main/main.c:1900 15#6 0x0000000000933577 in do_cli (argc=2, argv=0x10e1b60) 16 at /usr/local/src/php-7.1.4/sapi/cli/php_cli.c:1160 17#7 0x0000000000933c5b in main (argc=2, argv=0x10e1b60) 18 at /usr/local/src/php-7.1.4/sapi/cli/php_cli.c:1381
ここを表示しているソース(main/main.c)を見ると、出力している箇所全体が "#if ZEND_DEBUG" で囲まれていました。ZEND_DEBUG は、親分の PHP バイナリをビルドする際の configure で --enable-debug を付けると有効になるようです。試しに --enable-debug を付けないでやると、コンパイラに -DZEND_DEBUG が渡されず、実行しても "Freeing ..." が出ないことを確認できました。
ものの本(*1)によると、emalloc() は malloc() のラッパーであり、明示的に free() しなくても Zend Engine が自動的に未解放エリアを検知して開放してくれる仕組みのようですので、プログラマ的には気にしなくてもよいものだと思っているのですが、この認識で正しいでしょうか?
また、ZE3 向けの Extension 開発において、参考になるサイトや書籍等がありましたらご紹介いただけるとありがたいです。下記の本は(アマゾンの評価にも書きましたが)10年前の本なので、当然 PHP7 への言及はありません。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。