来自PHP中已注册的关闭函数的debug_backtrace()

时间:2011-08-30 10:29:32

标签: php stack-trace shutdown-hook debug-backtrace

在修补this question的答案时,我发现从debug_backtrace()内部调用register_shutdown_function()后,{{1}}无法追踪注册到{{1}}的函数。

PHP文档中的this comment register_shutdown_function()中提到了这一点,说明:

  

您可以从关闭函数内部调用debug_backtrace或debug_print_backtrace,以跟踪致命错误发生的位置。不幸的是,这些功能在关机功能中不起作用。

详细解释,对this answer州的评论:

  

不起作用。堆栈取消后会发生关闭功能。没有要转储的堆栈信息。

有没有办法绕过这个,迫使PHP保持堆栈跟踪直到进程完全终止,或者我们应该接受它作为给定的PHP内部结构?

5 个答案:

答案 0 :(得分: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');

答案 1 :(得分:9)

  

有没有办法绕过这个,迫使PHP保持堆栈跟踪

这是没有意义的,当调用注册函数时,所有已定义的函数都已从堆栈中返回或清除。

如果您需要知道代码退出的位置,那么您需要检测代码。

答案 2 :(得分:4)

根据我的经验,shutdown函数以一个干净的堆栈开始,它无法访问“原始”堆栈(因为它不再存在)。

不幸的是,没有办法保存原始堆栈。

答案 3 :(得分:4)

XDebug扩展程序中,有一个xdebug_get_function_stack()功能。

这个类似于PHP的内部debug_backtrace(),但即使在关闭处理程序中也能保持跟踪。

你不会得到确切的退出点,只有最后执行的功能才会发生关闭(由die() / exit()调用或错误触发)。

这当然只适用于开发环境。

答案 4 :(得分:0)

在您已注册的关闭功能中,您可以通过error_get_last函数获得追溯。在PHP7中对我有效。