概要
PHPDBG は、コードを変更せず、パフォーマンスに影響を与えることなく、PHP 実行環境を制御できる PHP SAPI モジュールです。
PHPDBG は、軽量で強力で使いやすい PHP デバッグ プラットフォームになることを目指しています。 PHP5.4以降で利用可能です。 php5.6 以降のバージョンでは内部的に統合されます。
- シングルステップデバッグ
- 柔軟なブレークポイントメソッド (クラスメソッド、関数、ファイル: 行、メモリアドレス、オペコード)
- php の eval を直接呼び出すことができます
- 現在実行されているコードを表示できます
- ユーザー空間 API (ユーザーランド/ユーザー空間)
- 便利な統合
- 指定された PHP 設定ファイルをサポート
- JIT グローバル変数
- readline サポート (オプション)、ターミナル操作がより便利
- Java GUI を使用したリモート デバッグ
- 操作は簡単 (詳細はヘルプを参照)
phpdgb を使用するには、まず php ソース コード パッケージをダウンロードする必要があります。次に、phpdgb のソース コード パッケージをダウンロードし、php ソース コード パッケージの sapi ディレクトリに配置します。最後に、インストール コマンドを実行できます。コンパイルとインストールの例は次のとおりです。 php のソース コード パッケージをダウンロードし、/home/php ディレクトリに配置したと仮定します。
#cd /home/php/sapi#git clone https://github.com/krakjoe/phpdbg#cd ../#./buildconf --force#./config.nice#make -j8#make install-phpdbg
注: 1. php バージョンが php5.6 以降の場合、phpdbg は php コード パッケージに統合されているため、個別にダウンロードする必要はありません。 2. コンパイルパラメータに –enable-phpdbg を忘れずに追加してください。 3. コンパイル時パラメータ –with-readline はオプションで追加できます。追加しないとphpdbgの履歴やその他の機能が使用できなくなります。
phpdbg は、コマンドラインで php をデバッグできる php の sapi です。一般的に使用されるパラメータは次のとおりです。
次のスイッチが実装されています (cli SAPI と同様): -n php ini を無視します -c パス内の php ini を検索します -z load zend extension -d define php ini エントリ次の変更により、phpdbg のデフォルトの動作が切り替わります。-v 静音性を無効にします。-s を有効にします。ステッピングを有効にします。-e 実行コンテキストを設定します。-b 退屈 – コンソールでの色の使用を無効にします。-I 無視します。.phpdbginit (デフォルトの init ファイル)。-i .phpgdbinit を上書きします。 location (-I を意味します)-O oplog 出力ファイルを設定します-q 起動時にバナーを印刷しません-r run に直接ジャンプします-E eval() を介したステップを有効にします注: -rr を渡すと、実行後に phpdbg が返されるのではなく終了します。コンソールへ
以前 gdb ツールを紹介しました。実際、phpdbg と gdb の機能はいくつかの点で非常に似ています。たとえば、ブレークポイントを設定したり、ステップスルーしたりできます。 Gdb は C または C++ 言語のデバッグに重点を置いているのに対し、phpdbg は PHP 言語のデバッグに重点を置いているというだけです。以下に、phpdbg の一般的なデバッグ機能をいくつか紹介します。デバッグするコードは次のとおりです。 test_phpdbg_inc.php ファイルのソース コードは次のとおりです。
<?php function phpdbg_inc_func(){ echo "phpdbg_inc_func \n"; } ?>
ファイル test_phpdgb.php のソース コードは次のとおりです。
<?php include(dirname(__FILE__)."/test_phpdbg_inc.php"); class demo{ public function __construct(){ echo __METHOD__.":".__LINE__."\n"; } public function func($param){ $param++; echo "method func $param\n"; } public function __destruct(){ echo __METHOD__.":".__LINE__."\n"; } } function func(){ $param = "ali"; $param = $param + "baba"; echo "function func $param\n"; } $demo = new demo(); $demo->func(1); func(); phpdbg_inc_func();?>
phpdbg を起動します
phpdbg が正常にインストールされると、インストール ディレクトリの bin ディレクトリに配置されます。 bin ディレクトリに入り、phpdbg を直接入力します。以下のように:
#phpdeg[Welcome to phpdbg, the interactive PHP debugger, v0.4.0]To get help using phpdbg type "help" and press enter[Please report bugs to <http://github.com/krakjoe/phpdbg/issues>]prompt>
デバッグする php スクリプトをロードするには、exec コマンドを実行するだけです。以下のように:
#phpdbg......prompt> exec ./test_phpdbg.php
もちろん、phpdbg の起動時に e パラメータを指定することもできます。以下のように:
#phpdbg -e ./test_phpdbg.php
ヘルプ情報を表示
これまでに他のデバッグ ツールを使用したことがある場合は、phpdbg がそれらに似ていることがわかるでしょう。ただし、使用の初期段階では、ヘルプ情報を取得する必要があることがよくあります。 help コマンドを通じてヘルプ情報を取得できます。
......prompt> helpphpdbg is a lightweight, powerful and easy to use debugging platform for PHP5.4+It supports the following commands:Information list list PHP source......
ブレークポイントの設定
ブレークポイントを設定するコマンドは gdb と同じです。それらはすべてbreakであり、略称はbです。ただし、特定のコマンド パラメータは依然として異なります。 gdb のブレークポイント コマンドと同様に、「ファイル名: 行番号」または行番号でブレークポイントを設定できます。さらに、phpdbg には、PHP に固有のブレークポイントを設定するためのメソッドもいくつか提供されています。たとえば、opline に基づいてブレークポイントを設定したり、opcode に基づいてブレークポイントを設定したりします。
ご存知のとおり、PHP コードは最終的にオペコードに解析され、PHP カーネルによって 1 つずつ実行されます。 PHP ステートメントは複数のオペコードに解析される場合があります。オペコードによってブレークポイントを設定できれば、プログラムの実行プロセスをより正確に追跡できます。 phapdbg を使用してブレークポイントを設定する具体的な例を見てみましょう。
opline に従ってブレークポイントを設定します。 ここで言う opline は、メソッド エントリから始まる現在のコードの行番号です。たとえば、test_phpdgb.php ファイルでは、18 行目のコード「$param = $param + "baba";」の opline は 2 です。
......prompt> b func#2prompt> rdemo::__construct:5method func 2[Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)][Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)][Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)][Breakpoint #0 in func()#2 at ./test_phpdbg.php:18, hits: 1]>00018: $param = $param + "baba"; 00019: echo "function func $param\n";; 00020: }......
ブレークポイントの表示
gdb と同様、phpdbg もブレークポイントを表示するために info Break コマンドを使用します。例は次のとおりです。
....prompt> info break------------------------------------------------File Breakpoints:#1 /home/hailong.xhl/test_phpdbg.php:10------------------------------------------------Opline Breakpoints:#0 7ff3219e1df0 (function breakpoint)------------------------------------------------Function opline Breakpoints:#0 func opline 2....
上記の表示を通じて、ことがわかります。インフォブレークの表示結果にはブレークポイントの種類も表示されます。 # の後の数字はブレークポイント番号です。ブレークポイント番号に基づいてブレークポイントを削除できます。
ブレークポイントの削除
gdb コマンドとは異なります。 phpdbgの削除ブレークポイントはdeleteコマンドではなく、break delコマンドです。例は次のとおりです。
......prompt> break del 1[Deleted breakpoint #1]prompt>......
break del の後の数字 1 はブレークポイント番号です。
コードを表示
phpdbg查看代码的命令也是list。但是和gdb相比,使用的方式更多样一些。显示指定函数的代码:
......prompt> l f func 00017: $param = "ali"; 00018: $param = $param + "baba"; 00019: echo "function func $param\n";; 00020: } 00021:prompt>......
单步执行
phpdbg的单步执行只有一个命令 step。和gdb的step命令差不多。都是一行一行的执行代码。注意,phpdbg是没有next命令的。
....prompt> s[Breakpoint #0 resolved at func#2 (opline 0x152ba40)][L19 0x152ba70 ZEND_ADD_STRING C2 @0 ./test_phpdbg.php]>00019: echo "function func $param\n";; 00020: } 00021:....
继续执行
和gdb一样,phpdbg的继续执行命令也是continue,简写形式为c。
执行php代码
这个是phpdbg的一个特色。可以在调试的过程中使用ev命令执行任意的php代码。如:
......prompt> ev $var = "val";valprompt> ev var_dump($var);string(3) "val"......
可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果。