Dan*_*ugg 23 php stack-trace debug-backtrace shutdown-hook
在修补这个问题的答案的同时,我发现当从内部调用时,debug_backtrace()不会超出注册的函数register_shutdown_function().
这是中提到此评论为register_shutdown_function()在PHP文档,指出:
您可以从关闭函数内部调用debug_backtrace或debug_print_backtrace,以跟踪致命错误发生的位置.不幸的是,这些功能在关机功能中不起作用.
更详细地解释一下,对这个答案状态的评论:
不行.堆栈取消后会发生关闭功能.没有要转储的堆栈信息.
有没有办法绕过这个,迫使PHP保持堆栈跟踪直到进程完全终止,或者我们应该接受它作为给定由于PHP内部?
pow*_*tac 15
这是一个非常昂贵的解决方案.我从未使用过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');
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过这个,迫使PHP保持堆栈跟踪
这是无意义的,当调用注册函数时,所有已定义的函数都已从堆栈中返回或清除.
如果您需要知道代码退出的位置,那么您需要检测代码.
在XDebug扩展中,有一个xdebug_get_function_stack()函数。
这与 PHP 的 internal 类似debug_backtrace(),但即使在关闭处理程序中也能保持跟踪。
但是,您不会获得确切的退出点,只有在关闭发生之前最后执行的函数(由die()/exit()调用或错误触发)。
这当然只适用于开发环境。