Debug print backtrace: примеры (PHP)

Использование 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]
С параметром limit

Ограничение вывода двумя последними вызовами.

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).

Расширенные примеры

Использование внутри класса

Трассировка показывает вызовы методов, включая статические.

Пример php
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]
Рекурсивный вызов

Функция отображает каждый уровень рекурсии.

Пример php
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]
Совместное использование с обработкой ошибок

Вывод трассировки при перехвате исключения.

Пример php
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}
        )
)
Форматирование вывода в файл

Перенаправление вывода функции в файл с помощью буферизации.

Пример php
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
file_put_contents('trace.log', $trace);

Аналоги в других языках

Python

Модуль traceback предоставляет функции для извлечения и форматирования трассировки стека.

import traceback
def a():
    b()
def b():
    for line in traceback.format_stack():
        print(line.strip())
a()
File "test.py", line 8, in 
    a()
File "test.py", line 3, in a
    b()
File "test.py", line 6, in b
    for line in traceback.format_stack():
JavaScript

Свойство 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

СУБД MySQL не имеет прямой аналогии, так как это не язык общего назначения. Для отладки хранимых процедур используются инструкции SIGNAL или GET DIAGNOSTICS.

PHP debug_print_backtrace function comments

En
Debug print backtrace Prints a backtrace