« Flickrとのマッシュアップ! (PopBoxとdhtmlxGrid) その3 | メイン | テンプレートの記述もPerlで - Template::Declareを使う »

関数のデバッグトレースはてなブックマークに追加 livedoorクリップに追加 Yahoo!ブックマークに追加 del.icio.usに追加 イザ!ブックマーク ニフティクリップに追加

PHP 担当の高杉です。


PHPでアプリを書いていて結構困ってしまう場面がデバッグだったりすると思います。
今回はデバッグを助けてくれるライブラリを紹介したいと思います。

PHP_FunctionCallTracerというPEARライブラリがあります。
これは関数のデバッグトレースを行うためのライブラリで、
トレース結果を表示したり、ファイルへ書き出したりすることができます。
これを利用するとデバッグ作業がかなり楽になります。
PEARライブラリですので、利用できる場面も多いと思います。

インストール

まずは、PEARコマンドを使ってインストールします。

$ pear install PHP_FunctionCallTracer

テストスクリプトとして以下の内容のsample.phpを作成します。

sample.php:
<?php
	require_once 'PHP/FunctionCallTracer.php';

	function testCallTracer($before)
	{
		PHP_FunctionCallTracer::traceArguments();

		$after = strtoupper($before);
		PHP_FunctionCallTracer::traceVariables($after);

		PHP_FunctionCallTracer::traceReturn($after);
		return $after;
	}

	testCallTracer('test');
	PHP_FunctionCallTracer::putTrace();
?$gt;

実行

実行してみましょう。
$ php sample.php
Array
(
  [php_uname] =$gt; Linux 
  [date] =$gt; Wed, 12 Sep 2007 14:02:14 UTC
  [calls] =$gt; Array
    (
      [0] =$gt; Array
        (
          [call] =$gt; Array
            (
              [file] =$gt; /path/to/sample.php
              [line] =$gt; 15
              [function] =$gt; testCallTracer
            )

          [in] =$gt; Array
            (
              [file] =$gt; /path/to/sample.php
              [line] =$gt; 6
              [args] =$gt; Array
                (
                  [0] =$gt; test
                )
            )

          [watches] =$gt; Array
            (
              [0] =$gt; Array
                (
                  [file] =$gt; /path/to/sample.php
                  [line] =$gt; 9
                  [args] =$gt; Array
                    (
                      [0] =$gt; TEST
                    )
                )
            )

          [out] =$gt; Array
            (
              [file] =$gt; /path/to/sample.php
              [line] =$gt; 11
              [args] =$gt; Array
                (
                  [0] =$gt; TEST
                )
            )
        )
    )
 )
※一部出力結果を書き換えてあります。

出力結果には関数の引数や戻り値、指定した変数などがスクリプト名やその行番号と共に表示されているのがわかると思います。
それぞれ

・traceArguments() … [call],[in]
・traceVariables() … [watches]
・traceReturn() … [out]

といったように対応しています。

ファイルへの出力は、putTrace()で

PHP_FunctionCallTracer::putTrace("/path/to/filename");

のようにファイル名を指定することで、ファイルへ出力することもできます。

PHP_FunctionCallTracerは他のPHP用デバッガの置き換えを目指したものではありません。
高機能ではありませんが、リモートデバッグ時に複雑な関数呼び出しの動作をトレースする際は便利ですね。