如何解决为什么debug_backtrace似乎跳过了几个重要的“步骤”,使我无法进行致命错误的调试?
我的最终目标是能够正确记录“致命”错误,而不幸的是set_error_handler
看不到这些错误。
当前,所有PHP都执行log:
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
不会“得到”致命错误,因此我(在堆栈交换上)发现an alleged way仍然可以通过注册用于检查最后一个错误的“关闭功能”来处理这些错误, 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()
或nonbroken_function()
也没有提及。我不明白尽管很明显是在这个最小的测试/示例中导致致命错误的原因,但在“真实世界”中从来没有或很少出现过这种情况,在这种情况下,它将仅指向我的复杂系统中某个通用行,并且是唯一的“回溯” ”仅由关机处理程序功能和错误处理程序功能组成。没有真正的“上下文”。我不明白我在做什么错。
此外,由于PHP默认会记录致命错误,因此我不了解error_get_last()
的含义,但是即使我使用backtrace函数,也不会显示任何上下文。
我已经重新阅读了关于debug_backtrace
函数的手册,但是关于回溯是什么的介绍很少。我以为我明白这是什么,但显然我不明白吗?
“截止”回溯是否可能与致命错误这一事实有某种联系,这甚至使基本功能也无法正常运行?如果是这种情况,这是否就意味着在没有纯粹的猜测/手动计算代码的情况下,不可能正确地记录(并调试)致命错误?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。