отладка обратной трассировки() из зарегистрированной функции выключения в PHP


Пытаясь найти ответ на этот вопрос , я обнаружил, что debug_backtrace() не выходит за пределы функции, зарегистрированной в register_shutdown_function(), при вызове из нее.

Это было упомянуто в этом комментарии для register_shutdown_function() в документах PHP указано:

Вам может прийти в голову идея вызвать debug_backtrace или debug_print_backtrace изнутри функции выключения, чтобы отследить, где произошла фатальная ошибка. К сожалению, эти функции не будут работать внутри функция выключения.

Объяснено немного подробнее, комментарии к этот ответ состояние:

Не работает. Функция выключения выполняется после того, как стек размотан. Нет никакой информации о стеке для сброса.

Есть ли какой-либо способ обойти это, заставив PHP удерживать трассировку стека до тех пор, пока процесс не завершится полностью, или мы должны принять это как данность из-за внутренних функций PHP?

Author: Community, 2011-08-30

4 answers

Есть ли способ обойти это, заставив PHP удерживать трассировку стека

Это довольно бессмысленно, когда вызывается зарегистрированная функция, все ваши определенные функции возвращаются или удаляются из стека.

Если вам нужно знать, где вышел ваш код, вам нужно настроить свой код.

 7
Author: symcbean, 2011-08-30 12:08:50

Это очень дорогое решение. Я никогда не использовал register_tick_function() или tick и я не уверен, работает ли это так, как ожидалось.

declare(ticks=1);

function tick_handler() {
    global $backtrace;
    $backtrace = debug_backtrace();
}
register_tick_function('tick_handler');



function shutdown() {
    global $backtrace;
    // do check if $backtrace contains a fatal error...
    var_dump($backtrace);
}
register_shutdown_function('shutdown');
 14
Author: powtac, 2011-08-30 10:48:57

По моему опыту, функция завершения работы начинается с чистого стека, и у нее нет доступа к "исходному" стеку (поскольку в этот момент он больше не существует).

К сожалению, нет способа сохранить этот исходный стек.

 4
Author: Piskvor, 2011-08-30 10:43:05

В расширении xdebug имеется xdebug_get_function_stack() функция.

Этот работает аналогично внутреннему debug_backtrace() PHP, но сохраняет трассировку даже в обработчике завершения работы.

Однако вы не получите точную точку выхода, только последнюю выполненную функцию перед завершением работы (вызванную die()/exit() вызов или ошибка).

Это, конечно, подходит только для среды разработки.

 4
Author: oujesky, 2014-10-13 12:14:49