debug_print_backtrace
(PHP 5, PHP 7)
debug_print_backtrace — Выводит стек вызовов функций
Описание
$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]
Коментарии
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;
}
?>
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()));
?>
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");
If you see string arguments and parameters getting cut off like this:
#0 hook.php(324): output_notice('checkout_before...')
#1 hook.php(348): invoke_hook('checkout_before...', Array)
You can increase the maximum length of arguments and parameters in the printed trace through an PHP INI setting:
<?php
ini_set('zend.exception_string_param_max_len', 100);
debug_print_backtrace();
?>
…so you can read the full arguments:
#0 hook.php(324): output_notice('checkout_before_payment')
#1 hook.php(348): invoke_hook('checkout_before_payment', Array)
In edge cases, it might even uncover nested traces that you didn't notice before.