LoginSignup
11
5

More than 5 years have passed since last update.

phpdbgの-eオプションの意味が1年くらいの期間で変わっていた

Last updated at Posted at 2016-11-24

PHP同梱のデバッガphpdbgの情報をネットで調べると、phpdbg -e [file名]のような起動オプションを紹介しているページが多く見つかります。実際、phpdbgの公式マニュアルにもそのように書いてあるわけですから、まさかこれが間違っているとは誰も思わないでしょう。

しかし、実際には-eオプションなしでも問題なく動きます。それどころか、-eオプションをつけると無駄なオペコードが発行されます。具体的には、次のようにすれば確認できます。

foo.php
<?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内で何に使われているかはわかりませんでした。実は何も使っていない可能性さえありそうです。

phpdbghelp optionsとすると次のように表示されます。

  -e                          Generate extended information for debugger/profiler

debugger/profilerというのは自分自身のことなのか、別のextensionやライブラリと組み合わせて使う想定なのか、ちょっとわかりませんでした。詳しい方がいらしたら教えてください。


  1. extensionなどでフックして利用するのが主目的だという認識です 

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5