26

在修补这个问题的答案时,我发现当从其中调用时,debug_backtrace()它不会超出注册到的函数register_shutdown_function()

这在 PHP 文档的评论中提到,说明:register_shutdown_function()

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

解释得更详细一点,对此答案状态的评论:

不工作。关闭功能在堆栈展开后发生。没有要转储的堆栈信息。

有什么办法可以规避这种情况,强制 PHP 保留堆栈跟踪,直到进程完全终止,还是由于 PHP 内部机制我们应该接受它作为给定的?

4

5 回答 5

17

这是一个非常昂贵的解决方案。我从未使用过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');
于 2011-08-30T10:43:33.337 回答
9

有什么办法可以规避这个,强制 PHP 持有堆栈跟踪

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

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

于 2011-08-30T12:08:50.973 回答
6

XDebug扩展中,有一个xdebug_get_function_stack()函数。

这个工作类似于 PHP 的 internal debug_backtrace(),但即使在关闭处理程序中也会保留跟踪。

但是,您不会得到确切的退出点,只有在关闭发生之前最后执行的函数(由die()/exit()调用或错误触发)。

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

于 2014-10-13T12:14:49.083 回答
5

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

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

于 2011-08-30T10:43:05.993 回答
0

在您注册的关闭函数中,您可以通过error_get_last函数获取回溯。在 PHP7 中为我工作。

于 2019-01-21T01:33:16.087 回答