首页 > 解决方案 > 为什么 debug_backtrace() 似乎跳过了几个重要的“步骤”,使我无法调试致命错误的来源?

问题描述

我的最终目标是能够正确记录“致命”错误,遗憾的是set_error_handler.

目前,PHP 所做的只是记录:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 65011744 bytes) in blablabla.php on line 27

这种日志几乎没有用,因为它只告诉我它死的最后一个“点”。这就是为什么我使用自定义错误处理程序来记录“所有”错误debug_backtrace()。但是由于set_error_handler没有“得到”致命错误,我(在 Stack Exchange 上)发现了一种处理这些错误的所谓方法,方法是注册一个“关闭函数”来检查最后一个错误,生成debug_backtrace()并记录它。

可悲的是,当我尝试时,它debug_backtrace()似乎非常有限,根本不包括所有“步骤”。例子:

function handle_critical_errors()
{
    $error_data = error_get_last();
    var_dump($error_data);
    var_dump(debug_backtrace());
}

function shutdown_handler_function()
{
    handle_critical_errors();
}

register_shutdown_function('shutdown_handler_function');

function nonbroken_function()
{
    broken_function();
}

function broken_function()
{
    $buffer = '';

    for ($i = 0; $i < 999999999999999; $i++)
        $buffer .= 'this is intended to exhaust all availabile memory because trigger_error doesn\'t let me trigger a fatal error for unknown reasons';
}

nonbroken_function();

当我运行它时,输出如下:

array(4) {
  ["type"]=>
  int(1)
  ["message"]=>
  string(83) "Allowed memory size of 134217728 bytes exhausted (tried to allocate 65011744 bytes)"
  ["file"]=>
  string(54) "blablablabla.php"
  ["line"]=>
  int(27)
}
array(2) {
  [0]=>
  array(4) {
    ["file"]=>
    string(54) "blablablabla.php"
    ["line"]=>
    int(12)
    ["function"]=>
    string(22) "handle_critical_errors"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(2) {
    ["function"]=>
    string(25) "shutdown_handler_function"
    ["args"]=>
    array(0) {
    }
  }
}

没有提到broken_function()or nonbroken_function(),即使这些被调用了。我不明白。尽管在这个最小的测试/示例中导致致命错误的原因很明显,但在“现实世界”中从来没有或很少出现这种情况,它只会指向我复杂系统中某处的通用线和唯一的“回溯" 仅由关闭处理函数和错误处理函数组成。没有真正的“背景”。我不明白我做错了什么。

此外,我不明白error_get_last()开始的意义,因为 PHP 在默认情况下会记录 FATAL 错误,但是即使我使用回溯函数,也不会显示任何上下文。

我已经重新阅读了有关该debug_backtrace功能的手册,但它几乎没有说明什么是回溯。我以为我明白它是什么,但显然,我不明白?

“截止”回溯是否可能与这是一个致命错误这一事实有关,这甚至使基本功能也无法正常运行?如果是这种情况,这是否意味着如果没有纯粹的猜测/手动计算代码,就不可能正确记录(并因此调试)致命错误?

标签: phperror-handlingfatal-errorbacktracedebug-backtrace

解决方案


推荐阅读