我正在用Yii框架构建一个应用程序,并且正在尝试确定内存不足错误的原因。是否有可能获得堆栈跟踪?我尝试过做一些类似的事情。
function handleShutdown() {
debug_print_backtrace();
$error = error_get_last();
$info = "[SHUTDOWN] file:".$error['file']." | ln:".$error['line']." | msg:".$error['message'] .PHP_EOL;
echo $info;
}
register_shutdown_function('handleShutdown');
但是debug_print_backtrace()不会显示任何内容,
# 0 handleShutdown()
[SHUTDOWN] file:C:\Users\bkuhl\htdocs\instaLabel\yii-1.1.12\base\CModule.php | ln:530 | msg:Allowed memory size of 67108864 bytes exhausted (tried to allocate 65488 bytes)
我已经检查了CModule.php,在那个文件中没有行号530。它只转到518。
4条答案
按热度按时间von4xj4u1#
在我的例子中,这是因为我有无限的函数递归。当我向PHP添加xDebug扩展时,由于函数调用限制,它抛出了一个精确的错误。
km0tfn4u2#
用xdebug来配置你的应用程序。它应该告诉你哪个函数被调用了多久,它消耗了多少内存。
rhfm7lfc3#
请记住,由于存在致命的内存错误,很难进行调试,原因很简单,您可能没有足够的内存来运行调试器。
例如,如果我还有100个字节,我就不能运行太多,所以你的关机功能的结果会有所不同。
至于你的行号不存在,是不是这个文件正在运行eval(),拉入另一个文件或者输出一些可能导致行号错误的东西?我会读一下那个文件和调用文件,看看它是如何运行的。抱歉,我不能再帮你了,我对Yii框架不熟悉。
nszi6y054#
使用shutdown函数是不可能从一个致命错误中找到回溯跟踪的,因为这个函数是从PHP生命周期中调用的,而不是从其他代码中调用的。因此,您的stacktrace是正确的--这是shutdown函数的stacktrace,它是空的:(