traceArguments() を使用して、関数の引数をトレースします。 トレースをする際に、関数の引数を traceArguments() に渡す必要はありません。その関数が他の関数をコールしない場合、 あるいはその関数がコールする関数はトレースしないという場合については traceArguments() は使用しないこともあります。
traceVariables() を使用して、関数内の変数をトレースします。 トレースする変数を traceVariables() の引数として渡す必要があります。 traceVariables() は、 ウォッチ対象の変数の値が変わるたびにコールされることになります。
traceReturn() を使用して、関数の返り値をトレースします。 トレースする返り値を traceReturn() の引数として渡す必要があります。
putTrace() を使用して、 トレース結果を標準出力やファイルに書き出します。
この例では、
package.php
の つのクラスのメソッドをトレースしてみます。
このパッケージは trace.php
というアプリケーションで用いられており、
トレース結果は trace.txt
に保存します。
トレースを作成するには #php trace.php を実行します。
package.php
パッケージ
PHP_FunctionCallTracer がロードされているかどうかを class_exists('PHP_FunctionCallTracer', false) で確認するのは必須ではありません。 これは、トレース用のメソッドをコードの中に残しておく場合にのみ有用です。 こうしておけば、PHP_FunctionCallTracer がロードされている場合にのみトレースメソッドを実行するようになります。
<?php
class math {
/**
* tracing the arguments and the returned parameter
*
* note that traceReturn() calls traceArguments() by default which is fine here
* since this method does call other methods to trace
*/
public static function prod($x, $y)
{
// class_exists('PHP_FunctionCallTracer', false)
// and PHP_FunctionCallTracer::traceArguments();
$p = $x * $y;
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceReturn($p);
return $p;
}
/**
* tracing the arguments and the returned parameter
*
* traceArguments() must be called here since this method calls other methods
* that may be traced, so that traced calls are displayed in the right order
*/
public static function square($x)
{
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceArguments();
$x2 = self::prod($x, $x);
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceReturn($x2);
return $x2;
}
}
class geometry {
private $pi = 3.14;
/**
* tracing the arguments and the returned parameter
* another variable is traced along with the returned parameter
*/
public function circle($r)
{
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceArguments();
$pi2 = 2 * $this->pi;
$c = math::prod($r, $pi2);
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceReturn($c, $pi2);
return $c;
}
/**
* tracing the arguments, some variables and the returned parameter
*/
public function disk($r)
{
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceArguments();
$r2 = math::square($r);
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceVariables($r2, $this->pi);
$d = math::prod($r2, $this->pi);
class_exists('PHP_FunctionCallTracer', false) and
PHP_FunctionCallTracer::traceReturn($d);
return $d;
}
}
?>
アプリケーション trace.php
<?php
/**
* adds the path of the package if this is a raw install
* includes the package (example) to debug and the tracer package
*/
file_exists("../../../../PHP/") and set_include_path('../../../..' . PATH_SEPARATOR . get_include_path());
require_once 'package.php';
require_once 'PHP/FunctionCallTracer.php';
/**
* creates an instance of the class to debug and calls a few methods
* writes the trace in a file
*/
$geometry = new geometry;
$c = $geometry->circle(2);
$d = $geometry->disk(3);
$file = dirname(__FILE__) . '/trace.txt';
PHP_FunctionCallTracer::putTrace($file, false);
?>
トレース結果 trace.txt
Array ( [php_uname] => Windows NT mybox 5.1 build 2600 [date] => Friday, 03-Aug-07 09:17:30 UTC [calls] => Array ( [0] => Array ( [call] => Array ( [file] => trace.php [line] => 20 [function] => geometry->circle ) [in] => Array ( [file] => package.php [line] => 55 [args] => Array ( [0] => 2 ) ) [out] => Array ( [file] => package.php [line] => 61 [args] => Array ( [0] => 12.56 [1] => 6.28 ) ) ) [1] => Array ( [call] => Array ( [file] => package.php [line] => 58 [function] => math::prod ) [in] => Array ( [file] => package.php [line] => 22 [args] => Array ( [0] => 2 [1] => 6.28 ) ) [out] => Array ( [file] => package.php [line] => 22 [args] => Array ( [0] => 12.56 ) ) ) [2] => Array ( [call] => Array ( [file] => trace.php [line] => 21 [function] => geometry->disk ) [in] => Array ( [file] => package.php [line] => 71 [args] => Array ( [0] => 3 ) ) [watches] => Array ( [0] => Array ( [file] => package.php [line] => 75 [args] => Array ( [0] => 9 [1] => 3.14 ) ) ) [out] => Array ( [file] => package.php [line] => 80 [args] => Array ( [0] => 28.26 ) ) ) [3] => Array ( [call] => Array ( [file] => package.php [line] => 73 [function] => math::square ) [in] => Array ( [file] => package.php [line] => 35 [args] => Array ( [0] => 3 ) ) [out] => Array ( [file] => package.php [line] => 40 [args] => Array ( [0] => 9 ) ) ) [4] => Array ( [call] => Array ( [file] => package.php [line] => 37 [function] => math::prod ) [in] => Array ( [file] => package.php [line] => 22 [args] => Array ( [0] => 3 [1] => 3 ) ) [out] => Array ( [file] => package.php [line] => 22 [args] => Array ( [0] => 9 ) ) ) [5] => Array ( [call] => Array ( [file] => package.php [line] => 77 [function] => math::prod ) [in] => Array ( [file] => package.php [line] => 22 [args] => Array ( [0] => 9 [1] => 3.14 ) ) [out] => Array ( [file] => package.php [line] => 22 [args] => Array ( [0] => 28.26 ) ) ) ) [objects] => Array ( [0] => geometry Object ( [pi:private] => 3.14 ) [2] => same as #0 ) )