debug_print_backtrace

(PHP 5)

debug_print_backtrace Gibt die Daten für eine Ablaufverfolgung aus

Beschreibung

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

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 Kode.

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 6 notes

up
10
bishop
4 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
5
dany dot dylan at gmail dot com
5 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
chris dot kistner at gmail dot com
4 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
0
taner
6 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);

?>
up
0
aidan at php dot net
9 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
-1
bortuzar at gmail dot com
7 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);
?>
To Top