Xdebug によるスタックトレースの機能拡張
Xdebug を利用するとスタックトレースを、よりわかりやすい形式で表示することができます。
PHP 5.0 以降、PHP では debug_print_backtrace() ファンクションがサポートされており、スタックバックトレースを表示することは容易です。
例えば、show_contents() という関数内で foo() 関数を呼び出し、その中で debug_print_backtrace を呼ぶと次のような出力になります。
#0 foo() called at [C:\keicode\cgi\test.php:26] #1 show_contents() called at [C:\keicode\cgi\test.php:7]
Xdebug を用いると、エラーが発生したときに、自動的に次のようなトレースが出力されます。
( ! ) Fatal error: Call to undefined function bar() in C:\keicode\cgi\test.php on line 12 | ||||
---|---|---|---|---|
Call Stack | ||||
# | Time | Memory | Function | Location |
1 | 0.0040 | 64992 | {main}( ) | ..\test.php:0 |
2 | 0.0181 | 406152 | show_contents( ) | ..\test.php:7 |
3 | 0.0181 | 406152 | foo( ) | ..\test.php:28 |
尚、display_errors を Off とするとメッセージは出力されません。
ini_set('display_errors', 'Off');
ローカル変数の表示
また、php.ini に次の設定を追加すると、エラー発生時にローカル変数の内容をダンプすることができます。
xdebug.show_local_vars = 1
サンプルの出力は次の通りです。
( ! ) Fatal error: Call to undefined function foobar() in C:\keicode\cgi\test.php on line 61 | |||||
---|---|---|---|---|---|
Call Stack | |||||
# | Time | Memory | Function | Location | |
1 | 0.0045 | 67936 | {main}( ) | ..\test.php:0 | |
2 | 0.0190 | 409296 | show_contents( ) | ..\test.php:7 | |
Variables in local scope (#2) | |||||
$t = | string 'Hello' (length=5) |
グローバル変数のダンプ
以下のように dump_globals を有効にすると、エラー発生時に指定したグローバル変数の内容をダンプ出来ます。
xdebug.dump_globals = 1; xdebug.dump.SERVER = QUERY_STRING, REQUEST_URI;
上記の設定例では、$_SERVER["QUERY_STRING"] と $_SERVER["REQUEST_URI"] の内容を出力するので、 エラー発生時には、以下のようなメッセージが表示されます。
( ! ) Fatal error: Call to undefined function foobar() in C:\keicode\cgi\test.php on line 84 | |||||
---|---|---|---|---|---|
Call Stack | |||||
# | Time | Memory | Function | Location | |
1 | 0.0044 | 71392 | {main}( ) | ..\test.php:0 | |
2 | 0.0184 | 412768 | show_contents( ) | ..\test.php:7 | |
Dump $_SERVER | |||||
$_SERVER['QUERY_STRING'] = | string '' (length=0) | ||||
$_SERVER['REQUEST_URI'] = | string '/keicode/cgi/test.php' (length=59) | ||||
Variables in local scope (#2) | |||||
$t = | string 'Hello' (length=5) |
$_SERVER の全てのエントリを表示するには、次のように * を指定します。
xdebug.dump_globals = 1 xdebug.dump.SERVER = *
例外発生時のスタックトレース表示
例外発生時にスタックトレースを出力する場合は、以下を設定します。
xdebug.show_exception_trace = 1;