Debug print backtrace: примеры (PHP)
debug_print_backtrace(int $options = 0, int $limit = 0): voidФункция debug_print_backtrace
Функция debug_print_backtrace() выводит трассировку стека вызовов, которая показывает цепочку функций и методов, приведших к текущей точке выполнения. Эта функция применяется для отладки сложных сценариев, когда необходимо понять последовательность вызовов.
Функция принимает два необязательных аргумента:
- $options (int) - управляет выводом информации. Может принимать значения констант DEBUG_BACKTRACE_IGNORE_ARGS для исключения аргументов функций из вывода и DEBUG_BACKTRACE_PROVIDE_OBJECT для включения данных об объектах (значение по умолчанию).
- $limit (int) - ограничивает количество выводимых записей стека. По умолчанию равен 0, что означает вывод всего стека.
Короткие примеры использования
Простой вызов без аргументов.
function a() { b(); }
function b() { c(); }
function c() { debug_print_backtrace(); }
a();#0 c() called at [test.php:5] #1 b() called at [test.php:3] #2 a() called at [test.php:7]
Ограничение вывода двумя последними вызовами.
function x() { y(); }
function y() { z(); }
function z() { debug_print_backtrace(0, 2); }
x();#0 z() called at [test.php:5] #1 y() called at [test.php:3]
Использование флага DEBUG_BACKTRACE_IGNORE_ARGS.
function test($param) { debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); }
test('secret');#0 test() called at [test.php:2]
Похожие функции в PHP
- debug_backtrace() - возвращает трассировку стека в виде массива, что позволяет программно обработать данные. Предпочтительна, когда вывод требуется сохранить или проанализировать в коде.
- Exception->getTrace() - метод получения трассировки стека из объекта исключения. Используется в блоках catch.
- xdebug_get_function_stack() - функция расширения Xdebug, предоставляет расширенную информацию, но требует установки модуля.
Выбор функции зависит от задачи: debug_print_backtrace() подходит для быстрой отладки с немедленным выводом, а debug_backtrace() - для программной обработки трассировки.
Типичные ошибки
Передача строки вместо целого числа в параметр limit приводит к ошибке TypeError в PHP 8.
debug_print_backtrace(0, 'two');TypeError: debug_print_backtrace(): Argument #2 ($limit) must be of type int, string given
Вывод трассировки может раскрыть внутреннюю структуру приложения, что представляет угрозу безопасности. Функцию следует использовать только в отладочных целях.
// Включение вывода только при отладке
if (defined('DEBUG_MODE') && DEBUG_MODE) {
debug_print_backtrace();
}Изменения в версиях PHP
- PHP 5.4.0 - добавлен необязательный аргумент $limit.
- PHP 5.3.6 - добавлен необязательный аргумент $options.
- PHP 7.4.0 - параметр $options стал принимать значение по умолчанию DEBUG_BACKTRACE_PROVIDE_OBJECT.
- PHP 8.0.0 - типы параметров $options и $limit стали строгими (int).
Расширенные примеры
Трассировка показывает вызовы методов, включая статические.
class Demo {
public static function staticMethod() {
(new self())->instanceMethod();
}
public function instanceMethod() {
debug_print_backtrace();
}
}
Demo::staticMethod();#0 Demo->instanceMethod() called at [test.php:5] #1 Demo::staticMethod() called at [test.php:9]
Функция отображает каждый уровень рекурсии.
function recursive($n) {
if ($n > 0) {
recursive($n - 1);
} else {
debug_print_backtrace();
}
}
recursive(3);#0 recursive(0) called at [test.php:5] #1 recursive(1) called at [test.php:5] #2 recursive(2) called at [test.php:5] #3 recursive(3) called at [test.php:9]
Вывод трассировки при перехвате исключения.
try {
throw new Exception('Test');
} catch (Exception $e) {
debug_print_backtrace();
echo '---\n';
print_r($e->getTrace());
}#0 {main} thrown in test.php on line 3
---
Array
(
[0] => Array
(
[file] => test.php
[line] => 3
[function] => {main}
)
)Перенаправление вывода функции в файл с помощью буферизации.
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
file_put_contents('trace.log', $trace);Аналоги в других языках
Модуль traceback предоставляет функции для извлечения и форматирования трассировки стека.
import traceback
def a():
b()
def b():
for line in traceback.format_stack():
print(line.strip())
a()File "test.py", line 8, ina() File "test.py", line 3, in a b() File "test.py", line 6, in b for line in traceback.format_stack():
Свойство Error.stack содержит трассировку стека для объекта ошибки.
function a() { b(); }
function b() { console.log(new Error().stack); }
a();Error
at b (test.js:2:32)
at a (test.js:1:16)
at test.js:4:1СУБД MySQL не имеет прямой аналогии, так как это не язык общего назначения. Для отладки хранимых процедур используются инструкции SIGNAL или GET DIAGNOSTICS.