PHP 7.4.9 Released!

debug_print_backtrace

(PHP 5, PHP 7)

debug_print_backtrace Gibt die Daten für eine Ablaufverfolgung aus

Beschreibung

debug_print_backtrace ([ int $options = 0 [, int $limit = 0 ]] ) : void

debug_print_backtrace() gibt eine PHP Ablaufverfolgung aus. Diese enthält Ausgaben zu allen Funktionsaufrufen, mit include oder require eingebundenen Dateien und mit eval() ausgeführtem Code.

Parameter-Liste

options

Beginnend mit PHP 5.3.6 kann über diesen Parameter eine Bitmaske mit folgenden möglichen Optionen übergeben werden:

debug_print_backtrace() Optionen
DEBUG_BACKTRACE_IGNORE_ARGS Gibt an ob der "args" Index aller Funktions- und Methoden- Argumente weggelassen werden soll (um z.B. Speicher zu sparen).

limit

Beginnend mit PHP 5.4.0 kann hiermit die Anzahl der auszugebenden Aufrufebenen begrenzt werden. Der Vorgabewert (limit=0) führt zur Ausgabe aller Aufrufe.

Rückgabewerte

Es wird kein Wert zurückgegeben.

Changelog

Version Beschreibung
5.4.0 Der optionale Parameter limit wurde hinzugefügt.
5.3.6 Der optionale Parameter options wurde hinzugefügt.

Beispiele

Beispiel #1 debug_print_backtrace() Beispiel

<?php
// include.php Datei

function a() {
    
b();
}

function 
b() {
    
c();
}

function 
c(){
    
debug_print_backtrace();
}

a();

?>
<?php
// test.php Datei
// Dies ist die Datei die Sie ausführen sollten

include 'include.php';
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

#0  eval() called at [/tmp/include.php:5]
#1  a() called at [/tmp/include.php:17]
#2  include(/tmp/include.php) called at [/tmp/test.php:3]

#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]

Siehe auch

add a note add a note

User Contributed Notes 8 notes

up
59
bishop
11 years ago
Another way to manipulate and print a backtrace, without using output buffering:

<?php
// print backtrace, getting rid of repeated absolute path on each file
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
?>
up
24
dany dot dylan at gmail dot com
11 years ago
I like the output of debug_print_backtrace() but I sometimes want it as a string.

bortuzar's solution to use output buffering is great, but I'd like to factorize that into a function.  Doing that however always results in whatever function name I use appearing at the top of the stack which is redundant.

Below is my noddy (simple) solution.  If you don't care for renumbering the call stack, omit the second preg_replace().

<?php
   
function debug_string_backtrace() {
       
ob_start();
       
debug_print_backtrace();
       
$trace = ob_get_contents();
       
ob_end_clean();

       
// Remove first item from backtrace as it's this function which
        // is redundant.
       
$trace = preg_replace ('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);

       
// Renumber backtrace items.
       
$trace = preg_replace ('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace);

        return
$trace;
    }
?>
up
0
David Spector
10 days ago
If your show your error messages in HTML (with suitable safety using entities), this function won't work nicely because it uses newlines for formatting.

Here is a function that works similarly, but using <BR> tags. Insert it near the beginning of your program to add a stack to Warning output only, or modify it as you like:

// Here is code for error stack output in HTML:
function error_handler_callback($errno,$message,$file,$line,$context)
    {
    if ($errno === E_WARNING)
        echo "Stack, innermost first:<br>".nl2br((new Exception())->getTraceAsString());
    return false; // to execute the regular error handler
    }
set_error_handler("error_handler_callback");
up
-1
aidan at php dot net
15 years ago
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
up
-11
bortuzar at gmail dot com
13 years ago
If you want to get the trace into a variable or DB, I suggest to do the following:

<?php
    ob_start
();
       
debug_print_backtrace();
   
$trace = ob_get_contents();
   
ob_end_clean();

$query = sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')",
           
mysql_real_escape_string($trace));
mysql_query($query);
?>
up
-9
AB
4 years ago
This code will give you a simple horizontal stack trace to assist debugging:

<?php

class A {
    public function
testA() {
        echo
"<LI>Class A.testA ----??";
        echo
"<LI>".$this->whoDidThat();
    }
    public function
whoDidThat() {
       
$who=debug_backtrace();
       
$result="";
       
$count = 0;
       
$last=count($who);
        foreach(
$who as $k=>$v) {
            if (
$count++ > 0) {
               
$x="";
                if (
$count>2) {
                   
$x=">";
                }
               
$result="[line".$who[$k]['line']."]".$who[$k]['class'].".".$who[$k]['function'].$x.$result;
            }
        }
        return
$result;
    }
}
class
B extends A {
    public function
testB() {
        echo
"<LI>Class B.testB";
        echo
"<LI>".$this->whoDidThat();
    }
    public function
testA() {
        echo
"<LI>Class testB.testA  ---- Y";
        echo
"<LI>".$this->whoDidThat();
    }
}
class
C {
    public function
test() {
        echo
"<HR>";
       
$b=new B();
        echo
"<HR>Class C calling B.testA";
       
$b->testA();
    }
}

$c=new C();
$c->test();
echo
debug_print_backtrace();
?>

When run you get

Class C calling B.testA
*Class testB.testA ---- Y
*[line45]C.test>[line40]B.testA
up
-11
chris dot kistner at gmail dot com
10 years ago
Here's a function that returns a string with the same information shown in debug_print_backtrace(), with the option to exclude a certain amount of traces (by altering the $traces_to_ignore argument).

I've done a couple of tests to ensure that it prints exactly the same information, but I might have missed something.

This solution is a nice workaround to get the debug_print_backtrace() information if you're already using ob_start() in your PHP code.

<?php
function get_debug_print_backtrace($traces_to_ignore = 1){
   
$traces = debug_backtrace();
   
$ret = array();
    foreach(
$traces as $i => $call){
        if (
$i < $traces_to_ignore ) {
            continue;
        }

       
$object = '';
        if (isset(
$call['class'])) {
           
$object = $call['class'].$call['type'];
            if (
is_array($call['args'])) {
                foreach (
$call['args'] as &$arg) {
                   
get_arg($arg);
                }
            }
        }       

       
$ret[] = '#'.str_pad($i - $traces_to_ignore, 3, ' ')
        .
$object.$call['function'].'('.implode(', ', $call['args'])
        .
') called at ['.$call['file'].':'.$call['line'].']';
    }

    return
implode("\n",$ret);
}

function
get_arg(&$arg) {
    if (
is_object($arg)) {
       
$arr = (array)$arg;
       
$args = array();
        foreach(
$arr as $key => $value) {
            if (
strpos($key, chr(0)) !== false) {
               
$key = '';    // Private variable found
           
}
           
$args[] =  '['.$key.'] => '.get_arg($value);
        }

       
$arg = get_class($arg) . ' Object ('.implode(',', $args).')';
    }
}
?>
up
-16
taner
12 years ago
bortuzar: a simpler version, w/o output buffering:

<?php

$query
= sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')",
   
mysql_real_escape_string(join("\n", debug_backtrace())) );
mysql_query($query);

?>
To Top