debug_print_backtrace

(PHP 5, PHP 7)

debug_print_backtrace Выводит стек вызовов функций

Описание

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

debug_print_backtrace() выводит стек вызовов функций. Выводит вызовы функций, имена включенных/требуемых файлов и другую информацию из функций (eval()).

Список параметров

options

В версии 5.3.6, этот аргумент является битовой маской для следующих настроек:

debug_print_backtrace() options
DEBUG_BACKTRACE_IGNORE_ARGS Требуется или нет не выводить данные с индексом "args", то есть списки аргументов всех функций/методов, для уменьшения расхода памяти.

limit

В версии 5.4.0, этот аргумент используется для ограничения количества вызовов функций, которые будут выведены. По умолчанию (limit=0) будет выведен весь стек вызовов.

Возвращаемые значения

Эта функция не возвращает значения после выполнения.

Список изменений

Версия Описание
5.4.0 Добавлен необязательный аргумент limit.
5.3.6 Добавлен необязательный аргумент options.

Примеры

Пример #1 Пример использования debug_print_backtrace()

<?php
// include.php file

function a() {
    
b();
}

function 
b() {
    
c();
}

function 
c(){
    
debug_print_backtrace();
}

a();

?>
<?php
// test.php файл
// этот файл нужно запустить
include 'include.php';
?>

Результатом выполнения данного примера будет что-то подобное:

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

Смотрите также

  • debug_backtrace() - Выводит стек вызовов функций в массив

Коментарии

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/"''$trace1);

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

        return 
$trace;
    }
?>
2008-11-10 23:51:21
http://php5.kiev.ua/manual/ru/function.debug-print-backtrace.html
Автор:
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()));
?>
2009-07-28 16:20:13
http://php5.kiev.ua/manual/ru/function.debug-print-backtrace.html
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_ignore3' ')
        .
$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($keychr(0)) !== false) {
               
$key '';    // Private variable found
           
}
           
$args[] =  '['.$key.'] => '.get_arg($value);
        }

       
$arg get_class($arg) . ' Object ('.implode(','$args).')';
    }
}
?>
2010-04-01 07:31:43
http://php5.kiev.ua/manual/ru/function.debug-print-backtrace.html
Автор:
This code will give you a simple horizontal stack trace to assist debugging: 

<?php

class {
    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 
extends {
    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 
{
    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
2015-10-18 21:59:55
http://php5.kiev.ua/manual/ru/function.debug-print-backtrace.html
Автор:
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");
2020-08-02 17:58:16
http://php5.kiev.ua/manual/ru/function.debug-print-backtrace.html

    Поддержать сайт на родительском проекте КГБ