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()));
?>
(PHP 5, PHP 7, PHP 8)
debug_print_backtrace — Выводит обратную трассировку вызовов функций
Функция debug_print_backtrace() выводит обратный стек вызовов PHP-функций. Функция выводит вызовы функций, названия файлов, которые подключили выражениями include или require, и другую информацию, которую вычислили функции, например eval().
options
Параметр принимает битовую маску из следующих опций:
DEBUG_BACKTRACE_IGNORE_ARGS | Опция устанавливает бит, который определяет, исключать ли ключ "args" из выходного массива и вместе с ним аргументы функций и методов, чтобы уменьшить расход памяти. |
limit
Параметр ограничивает количество кадров стека в выходном массиве.
Со значением по умолчанию —
limit
=0
— возвращается весь стек вызовов функций.
Функция не возвращает значения после выполнения.
Пример #1 Пример вывода обратной трассировки вызовов функцией debug_print_backtrace()
<?php
/ Файл: include.php
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]
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()));
?>
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;
}
?>
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.
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");
Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!
Check out: eBank.nz (Art Generator) |
Netwrck.com (AI Tools) |
Text-Generator.io (AI API) |
BitBank.nz (Crypto AI) |
ReadingTime (Kids Reading) |
RewordGame |
BigMultiplayerChess |
WebFiddle |
How.nz |
Helix AI Assistant