Xdebug によるトレース機能拡張
Xdebug を利用するとトレース機能を拡張することができます。
Xdebug による自動トレース機能
自動トレースとは、プログラム実行時に呼び出された関数等の情報を全てトレースファイルに出力することです。
Xdebug による「自動」トレース機能を有効にするには、以下のように xdebug.auto_trace スイッチをオンにして、 トレースファイルの出力ディレクトリを指定します。
xdebug.auto_trace = 1 xdebug.trace_output_dir = C:/Temp
このように設定して PHP を実行すると、xdebug.trace_output_dir で指定したディレクトリ内に、 自動的にトレースファイルが作成され、その中に下記のようなトレースログが記録されます。
TRACE START [2009-09-15 8:38:16] 0.0050 68952 -> {main}() C:\keicode\cgi\test.php:0 0.0112 240056 -> include(C:\keicode\inc1.php) C:\keicode\cgi\test.php:3 0.0193 418392 -> include(C:\keicode\inc2.php) C:\keicode\site_common.php:3 0.0195 409624 -> header_h() C:\keicode\cgi\test.php:6 0.0196 410440 -> foo() C:\keicode\inc1.php:387 0.0200 410472 -> contents() C:\keicode\cgi\test.php:7 0.0201 410568 -> bar() C:\keicode\cgi\test.php:114 0.0202 411064 -> footer() C:\keicode\cgi\test.php:8 0.0220 73104 TRACE END [2009-09-15 8:38:16]
明示的なトレース
自動的に全てのトレースを記録するのではなく、一部のみのトレースを行いたい場合は次のようにします。
xdebug_start_trace 関数でログファイル名を指定し、トレースを開始します。xdebug_stop_trace 関数でトレースを停止します。
例として次のコードのトレースを取得しましょう。
<?php xdebug_start_trace( 'C:/Temp/log' ); $i = 10; $j = 5; echo foo($i, $j); xdebug_stop_trace(); function foo($m, $n) { return $m + $n; } ?>
これを実行すると C:\Temp\log.xt というログファイルが作成され、次の内容が記録されました。
TRACE START [2009-09-15 8:49:32] 0.0025 59672 -> foo() C:\Temp\tracetest.php:11 0.0035 59792 -> xdebug_stop_trace() C:\Temp\tracetest.php:14 0.0036 59792 TRACE END [2009-09-15 8:49:32]
戻り値のトレースも行う場合は、xdebug.collect_return スイッチを On にします。
xdebug.collect_return = 1
確かに以下のように戻り値が記録されています。
TRACE START [2009-09-15 8:05:44]
0.0019 59672 -> foo() C:\Temp\tracetest.php:11
>=> 15
0.0026 59792 -> xdebug_stop_trace() C:\Temp\tracetest.php:14
0.0027 59792
TRACE END [2009-09-15 8:05:44]
トレースファイル名
トレースファイル名は xdebug.trace_output_name で指定できます。
また、動的に付加する名前は以下の値が利用できます。
%c | 現在の作業ディレクトリの CRC チェックサム |
%p | プロセス ID |
%r | ランダムな数字 |
%u | タイムスタンプ |
%H | $_SERVER['HTTP_HOST'] の値 |
%R | $_SERVER['REQUEST_URI'] の値 |
例えば次のように指定して PHP を実行してみます。
xdebug.trace_output_name = "mytrace-%u"
すると、mytrace-1153038453_128051.xt という名前のファイルが作成されました。
実行時に現在のログファイル名を取得するには、xdebug_get_tracefile_name() 関数が利用できます。