PHP Doku:: Druckt die Daten für eine Ablaufverfolgung - function.debug-print-backtrace.html

Verlauf / Chronik / History: (10) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDas Verhalten von PHP beeinflussenFehlerbehandlung und ProtokollierungFehlerbehandlungsfunktionendebug_print_backtrace

Ein Service von Reinhard Neidl - Webprogrammierung.

Fehlerbehandlungsfunktionen

<<debug_backtrace

error_get_last>>

debug_print_backtrace

(PHP 5)

debug_print_backtrace Druckt die Daten für eine Ablaufverfolgung

Beschreibung

void debug_print_backtrace ( 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 Kode.

Parameter-Liste

Diese Funktion hat keine Parameter.

Rückgabewerte

Es wird kein Wert zurückgegeben.

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


9 BenutzerBeiträge:
- Beiträge aktualisieren...
chris dot kistner at gmail dot com
1.04.2010 14:31
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).')';
    }
}
?>
bishop
28.07.2009 22:20
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()));
?>
bradley dot giesbrecht at gmail dot com
14.01.2009 1:51
I was using the function by dany dot dylan at gmail dot com and found that preg_replace had string length limits. So here is yet another output format function.

<?php
if ( !function_exists ( "mydie" ) ) {
    function
mydie (  ) { $this_file = __FILE__ ; $this_line = __LINE__ ;
       
$buffer = array (  ) ;
       
$trace_calls = "" ;
       
ob_start (  ) ;
       
debug_print_backtrace (  ) ;
       
$buffer[ "0" ] = ob_get_contents (  ) ;
       
ob_end_clean (  ) ;
       
$buffer[ "0" ] = array_slice ( explode ( "#" , $buffer[ "0" ] ) , 1 , -1 , false ) ;
        foreach (
$buffer[ "0" ] as $key => $value ) {
           
$value = explode ( ") called at [" , $value ) ;
            if (
$key == 0 ) {
               
$value[ "0" ] = "0  " . __FUNCTION__ . "(see above vars)" ;
            }
           
$trace_calls .= "#" . implode ( ")\n\tcalled at [" , $value ) ;
        }
        unset (
$buffer , $key , $value ) ;
        echo
"<pre>function " . __FUNCTION__ . " lives here:{$this_file}:{$this_line}</pre>" ;
        echo (
"<pre>" . print_r( func_get_args (  ) , true ) . "</pre>" ) ;    
        if (
$trace_calls == "" ) $trace_calls = "No functions were called." ;
        echo (
"<pre>" . $trace_calls . "</pre>" ) ;    
        die ;
    }
}
function
a (  ) {
   
b ( func_get_args (  ) , 2 ) ;
}
function
b (  ) {
   
c ( func_get_args (  ) , 3 ) ;
}
function
c (  ) {
   
mydie ( func_get_args (  ) , 4 ) ;
}
a ( 1 ) ;
?>

## outputs
function mydie lives here:/path/file.php:4
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => 1
                        )

                    [1] => 2
                )

            [1] => 3
        )

    [1] => 4
)
#0  mydie(see above vars))
    called at [/path/file.php:54]
#1  c(Array ([0] => Array ([0] => 1),[1] => 2), 3)
    called at [/path/file.php:49]
#2  b(Array ([0] => 1), 2)
    called at [/path/file.php:43]
dany dot dylan at gmail dot com
11.11.2008 6:51
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;
    }
?>
harmor
19.02.2008 22:54
Input (Using: PHP Version 5.2.5-pl1-gentoo):
<?php
class CTest
{
    public static function
say($a_szVar)
    {
       
debug_print_backtrace();
        echo
'<br />';
    }
}

CTest::say('static call');

$obj = new CTest;
$obj->say('object call');
   
?>

Output:
#0 CTest::say(static call) called at [C:\PHPDocument4.php:11]
#0 CTest::say(object call) called at [C:\PHPDocument4.php:15]

Notice that the second line of the output outputs "::" instead of "->" when calling the function using an object.
taner
21.08.2007 13:52
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);

?>
bortuzar at gmail dot com
5.06.2007 20:23
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);
?>
petermarkellis at googlemail dot com
28.03.2007 12:10
A cleaner example:
<?php
function a() {
  
b();
}

function
b() {
  
c();
}

function
c(){
  
debug_print_backtrace();
}

a();

?>

outputs:
#0  c() called at [C:\debugbacktracetest.php:7]
#1  b() called at [C:\debugbacktracetest.php:3]
#2  a() called at [C:\debugbacktracetest.php:14]
aidan at php dot net
15.03.2005 10:47
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



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)