PHPのお勉強!

PHP TOP

debug_backtrace

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

debug_backtraceバックトレースを生成する

説明

debug_backtrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array

debug_backtrace() は PHP バックトレースを生成します。

パラメータ

options

このパラメータは次のオプションのビットマスクとなります。

debug_backtrace() のオプション
DEBUG_BACKTRACE_PROVIDE_OBJECT "object" インデックスを埋めるかどうか。
DEBUG_BACKTRACE_IGNORE_ARGS "args" インデックス、 すなわちすべての関数/メソッドの引数を省略してメモリを節約するかどうか。

注意:

可能な組み合わせは以下の4つです:

debug_backtrace() のオプション
debug_backtrace() インデックスを両方収集します。
debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT)
debug_backtrace(1)
debug_backtrace(0) インデックス "object" を省略し、"args" を収集します。
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) インデックス "object""args"両方省略します。
debug_backtrace(2)
debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT|DEBUG_BACKTRACE_IGNORE_ARGS) インデックス "object" を収集し、"args" を省略します。
debug_backtrace(3)

limit

このパラメータを使ってスタックフレームの数を制限できます。 デフォルト (limit=0) は、すべてのスタックフレームを返します。

戻り値

連想配列の配列を返します。連想配列の要素として返される可能性があるものは以下のとおりです。

debug_backtrace() から返される可能性がある要素
名前 説明
function string カレントの関数名。 __FUNCTION__ も参照ください。
line int カレントの行番号。 __LINE__ も参照ください。
file string カレントのファイル名。 __FILE__ も参照ください。
class string カレントのクラス名。 __CLASS__ も参照ください。
object object カレントのオブジェクト
type string カレントのコール方式。メソッドを呼び出している場合は "->"、 staticメソッドを呼び出している場合は "::" が返されます。 関数呼び出しの場合は何も返されません。
args array 関数の内部の場合、関数の引数のリストとなります。 インクルードされたファイル内では、 読み込まれたファイルの名前となります。

例1 debug_backtrace() の例

<?php
// ファイル名: /tmp/a.php

function a_test($str)
{
echo
"\nHi: $str";
var_dump(debug_backtrace());
}

a_test('friend');
?>

<?php
// ファイル名: /tmp/b.php
include_once '/tmp/a.php';
?>

/tmp/b.php を実行した際の結果は以下のようになります。

Hi: friend
array(2) {
[0]=>
array(4) {
    ["file"] => string(10) "/tmp/a.php"
    ["line"] => int(10)
    ["function"] => string(6) "a_test"
    ["args"]=>
    array(1) {
      [0] => &string(6) "friend"
    }
}
[1]=>
array(4) {
    ["file"] => string(10) "/tmp/b.php"
    ["line"] => int(2)
    ["args"] =>
    array(1) {
      [0] => string(10) "/tmp/a.php"
    }
    ["function"] => string(12) "include_once"
  }
}

参考

add a note

User Contributed Notes 37 notes

up
116
jurchiks101 at gmail dot com
11 years ago
Here's a function I just wrote for getting a nice and comprehensible call trace. It is probably more resource-intensive than some other alternatives but it is short, understandable, and gives nice output (Exception->getTraceAsString()).

<?php
function generateCallTrace()
{
$e = new Exception();
$trace = explode("\n", $e->getTraceAsString());
// reverse array to make steps line up chronologically
$trace = array_reverse($trace);
array_shift($trace); // remove {main}
array_pop($trace); // remove call to this method
$length = count($trace);
$result = array();

for (
$i = 0; $i < $length; $i++)
{
$result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
}

return
"\t" . implode("\n\t", $result);
}
?>

Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
up
13
robert at medianis dot net
8 years ago
Just a short note on debug_backtrace options for PHP 5.3.6 or newer:

debug_backtrace() - show all options
debug_backtrace(0) - exlude ["object"]
debug_backtrace(1) - same as debug_backtrace()
debug_backtrace(2) - exlude ["object"] AND ["args"]

use this example and try calling debug_backtrace with different options

<?php
function F1()
{
echo
"<br />";
echo
"in F1 now";
echo
"<pre>".print_r(debug_backtrace(2),true)."</pre>";
}

class
DebugOptionsTest
{
function
F2()
{
echo
"<br />";
echo
"in F2 now";
F1();
}

}

echo
"<hr />calling F1";
F1();

$c=new DebugOptionsTest();
echo
"<hr /><hr /><hr />calling F2";
$c->F2("testValue");

?>
up
10
jsnell at e-normous dot com
17 years ago
If you are using the backtrace function in an error handler, avoid using var_export() on the args, as you will cause fatal errors in some situations, preventing you from seeing your stack trace. Some structures will cause PHP to generate the fatal error "Nesting level too deep - recursive dependency?" This is a design feature of php, not a bug (see http://bugs.php.net/bug.php?id=30471)
up
2
liam at N0SPAM dot boxclever dot ca
1 year ago
Options provided by bitmask parameters can be disabled using !

<?php
debug_backtrace
( !DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);
?>
up
7
Emmett Brosnan
8 years ago
Quick and dirty formatted output from debug_backtrace.

$file_paths = debug_backtrace();

foreach($file_paths AS $file_path) {
foreach($file_path AS $key => $var) {
if($key == 'args') {
foreach($var AS $key_arg => $var_arg) {
echo $key_arg . ': ' . $var_arg . '<br>';
}
} else {
echo $key . ': ' . $var . '<br>';
}
}
}
up
2
michael dot schramm at gmail dot com
15 years ago
Be carefull if you are using objects as arguments for function calls!

<?php
error_reporting
(E_ALL);

function
myPrint($trace){
foreach(
$trace as $i=>$call){
/**
* THIS IS NEEDED! If all your objects have a __toString function it's not needed!
*
* Catchable fatal error: Object of class B could not be converted to string
* Catchable fatal error: Object of class A could not be converted to string
* Catchable fatal error: Object of class B could not be converted to string
*/
if (is_object($call['object'])) { $call['object'] = 'CONVERTED OBJECT OF CLASS '.get_class($call['object']); }
if (
is_array($call['args'])) {
foreach (
$call['args'] AS &$arg) {
if (
is_object($arg)) { $arg = 'CONVERTED OBJECT OF CLASS '.get_class($arg); }
}
}

$trace_text[$i] = "#".$i." ".$call['file'].'('.$call['line'].') ';
$trace_text[$i].= (!empty($call['object'])?$call['object'].$call['type']:'');
$trace_text[$i].= $call['function'].'('.implode(', ',$call['args']).')';
}

var_dump($trace_text);
}

class
A{
public function
test($obj){
$obj->test();
}
}

class
B{
public function
test(){
echo
myPrint(debug_backtrace());
}
}

$A = new A();
$B = new B();

$A->test($B);

?>
up
2
http://synergy8.com
19 years ago
It should be noted that if an internal php function such as call_user_func in the backtrace, the 'file' and 'line' entries will not be set.

Most debug tracers will use these entries. You should place a check to see if the key exists in the array before using this function. Otherwise notices will be generated.

<?php

$arrTrace
= debug_backtrace();

foreach (
$arrTrace as $arr)
{
if (!isset (
$arr['file']))
{
$arr['file'] = '[PHP Kernel]';
}

if (!isset (
$arr['line']))
{
$arr['line'] = '';
}

// Do something
}

?>
up
3
root at jackyyf dot com
12 years ago
When use register_shutdown_function, and the function called when shutting down, there are no line number nor filename information about this function, only function, class(if possible), type(if possible) and args are provided.
up
3
Bill Getas
14 years ago