PHP同梱のデバッガphpdbg
の情報をネットで調べると、phpdbg -e [file名]
のような起動オプションを紹介しているページが多く見つかります。実際、phpdbgの公式マニュアルにもそのように書いてあるわけですから、まさかこれが間違っているとは誰も思わないでしょう。
しかし、実際には-e
オプションなしでも問題なく動きます。それどころか、-e
オプションをつけると無駄なオペコードが発行されます。具体的には、次のようにすれば確認できます。
<?php
echo 1;
$ phpdbg -e foo.php
[Welcome to phpdbg, the interactive PHP debugger, v0.5.0]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
[Successful compilation of /private/tmp/foo.php]
prompt> print exec
[Context /private/tmp/foo.php (3 ops)]
L1-3 {main}() /private/tmp/foo.php - 0x106074000 + 3 ops
L2 #0 EXT_STMT
L2 #1 ECHO 1
L3 #2 RETURN 1
prompt>
このように、-e
オプションつきで実行すると3つのopcodeにコンパイルされているように見えます。
$ phpdbg foo.php
[Welcome to phpdbg, the interactive PHP debugger, v0.5.0]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
[Successful compilation of /private/tmp/foo.php]
prompt> print exec
[Context /private/tmp/foo.php (2 ops)]
L1-3 {main}() /private/tmp/foo.php - 0x10c874000 + 2 ops
L2 #0 ECHO 1
L3 #1 RETURN 1
prompt>
ところが、-e
オプションなしだとopcode 2個になるようです。これはもちろん-e
なしの方が通常のコンパイル結果になります。
-eオプションの正体
GitHub上の履歴をたどってみたところ、以前-e
は処理対象のファイル名を指定するためのオプション引数だったようです。これが、下記コミットのタイミング(2014年4月)でオプション指定が不要になりました。この時点では-e
を指定してもしなくても同じ挙動だったようです。
ところが、2015年6月に-e
オプションが復活しています。しかも昔と意味が変わっており、「EXT_STMT」などのopcodeを挿入するよ、という意味になっています。
このオプションは最新のPHPでも維持されています。
オプションの意味が変わって復活してたということなら、ドキュメントの不整合があっても仕方がないというものですね。とはいえ公式サイトの記述くらいは直してほしい気もします。
phpdbgを弁護しておくと、-e
を外したのは元々の作者の人で、新しい意味の-e
を作ったのは最近活発にメンテナンスしている別の人です。
-eオプションの使い道
新たに実装された方の-e
オプションを指定すると、デフォルトでは何もしないopcode 1 である「EXT_STMT」「EXT_FCALL_BEGIN」「EXT_FCALL_END」の3つが関数呼び出しの前後や各opcodeの前後などに挿入されます。
この機構はXdebugではカバレッジカウントに使われていたりしますが、phpdbg内で何に使われているかはわかりませんでした。実は何も使っていない可能性さえありそうです。
phpdbg
でhelp options
とすると次のように表示されます。
-e Generate extended information for debugger/profiler
debugger/profilerというのは自分自身のことなのか、別のextensionやライブラリと組み合わせて使う想定なのか、ちょっとわかりませんでした。詳しい方がいらしたら教えてください。
-
extensionなどでフックして利用するのが主目的だという認識です ↩