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
#TimeMemoryFunctionLocation
10.004064992{main}( )..\test.php:0
20.0181406152show_contents( )..\test.php:7
30.0181406152foo( )..\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
#TimeMemoryFunctionLocation
10.004567936{main}( )..\test.php:0
20.0190409296show_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
#TimeMemoryFunctionLocation
10.004471392{main}( )..\test.php:0
20.0184412768show_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;

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説