trigger_error stacktrace print mensaje mandar generate error cuadro php stack-trace shutdown-hook debug-backtrace

stacktrace - throw error php



debug_backtrace() desde la funciĆ³n de apagado registrada en PHP (4)

¿Hay alguna forma de evitar esto, forzando a PHP a mantener el seguimiento de la pila?

Eso no tiene sentido, cuando se invoca la función registrada, todas las funciones definidas han regresado o se han borrado de la pila.

Si necesita saber de dónde salió su código, debe instrumentar su código.

Mientras intentaba obtener una respuesta a esta pregunta , encontré que debug_backtrace() no rastrea más allá de la función registrada para register_shutdown_function() , cuando se llama desde dentro.

Esto se mencionó en este comentario para register_shutdown_function() en los documentos PHP, indicando:

Puede tener la idea de llamar a debug_backtrace o debug_print_backtrace desde dentro de una función de apagado, para rastrear dónde ocurrió un error fatal. Desafortunadamente, estas funciones no funcionarán dentro de una función de apagado.

Explicado con un poco más de detalle, los comentarios sobre este estado de respuesta :

No funciona La función de apagado ocurre después de que la pila se haya desenrollado. No hay información de pila para volcar.

¿Hay alguna forma de eludir esto, forzando a PHP a mantener el seguimiento de la pila hasta que el proceso haya finalizado por completo, o deberíamos aceptarlo como un hecho debido a los elementos internos de PHP?


Desde mi experiencia, la función de apagado comienza con una pila limpia, y no tiene acceso a la pila "original" (ya que ya no existe en ese punto).

Desafortunadamente, no hay manera de guardar esa pila original.


En la extensión XDebug , hay una función xdebug_get_function_stack() .

Este funciona de manera similar a la debug_backtrace() interna de PHP, pero mantiene el rastreo incluso en el controlador de apagado.

Sin embargo, no obtendrá el punto de salida exacto, solo la última función ejecutada antes de que se produjera el apagado (activada por la llamada o error die() / exit() ).

Por supuesto, esto es adecuado solo para el entorno de desarrollo.


Esta es una solución muy cara . Nunca usé register_tick_function() o tick y no estoy seguro de si funciona como se esperaba.

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'');