PHPでバックトレースを出力する方法について解説します。
バックトレースというのは、呼び出し階層のようなものです。
エラーが発生した時に、何行目でエラーが発生してどのようなルートでメソッドが呼び出されていったかが表示されますよね。
そのバックトーレスをエラーが発生していない時に出力する方法になります。
- PHP標準の関数で出力する方法
- クラス名やメソッド名など情報をカスタマイズして出力する方法
の2パターンの方法をご紹介します。
debug_print_backtrace()で呼び出し階層を一発出力
特に理由がなければこの方法が簡単です。
PHP標準で用意されているdebug_print_backtrace()を使います。
バックトレースを出力したい箇所で、debug_print_backtrace()をコールすればOKです。
下記のようなテキストが出力されます。
#0 c() called at [/tmp/include.php:10]
#1 b() called at [/tmp/include.php:6]
#2 a() called at [/tmp/include.php:17]
#3 include(/tmp/include.php) called at [/tmp/test.php:3]
リファレンスはこちら
カスタマイズしてクラス名・関数名・引数の値も出力できる
もう1つの方法は、少し手間をかけて出力する形式を自由にカスタマイズする方法です。
debug_backtrace()というメソッドは、バックトーレスの情報を配列で返します。
この情報を利用して、自由な形式で出力させます。
サンプルを用意しましたので、参考にしてください。
コピペ利用して頂いても良いです。
このサンプルコードでは、下記の情報をバックトーレスから取得して出力しています。
- ファイル名
- 行数
- クラス名
- 関数名
- 関数の場合は引数
サンプルコード
function print_debugtrace($printArgs = false) {
$dbg = debug_backtrace();
for ($i = 0; $i < count($dbg); $i++) {
echo $i . ")";
echo $dbg[$i]['file'];
echo "(" . $dbg[$i]['line'] . ")";
echo ":" . $dbg[$i]['class'];
echo $dbg[$i]['type'];
echo $dbg[$i]['function'];
echo "<br>";
// 引数出力
if ($printArgs) {
echo "<div style='margin-left: 1.0em;'>";
print_r($dbg[$i]['args']);
echo "</div>";
echo "<br>";
}
}
}
出力結果サンプル
0)/test/test.php(44):Test->print_debugtrace
Array ( [0] => 1 )
1)/test/index.php(27):Index->init
Array ( )
まとめ:バックトーレス(呼び出し階層)はデバッグに役立つ
PHPでバックトーレスを出力する方法でした。
複雑なシステムだと「これどこから呼び出されてんだろう」って事もありますよね。
この方法で呼出階層を辿れば解析も捗ります。
更に解析をはかどらせたいなら、Xdebugを利用してデバッグ設定をするのもオススメです。
ステップ実行出来たり、変数の中身を見たり出来るようになるのでデバッグ作業が断然はかどります。
この記事が少しでも参考になれば幸いです。
最後までお読み頂きありがとうございました。