PhpUnit 未显示 php 致命错误的堆栈跟踪
Posted
技术标签:
【中文标题】PhpUnit 未显示 php 致命错误的堆栈跟踪【英文标题】:PhpUnit not showing a stack trace for a php fatal error 【发布时间】:2011-08-25 01:58:46 【问题描述】:phpUnit 当前未显示代码中发生的 PHP 错误的堆栈跟踪。
我该如何配置它?
【问题讨论】:
您能否提供一些示例代码,因为我不确定我是否理解正确。 (它似乎对我有用,也许我误解了) 如中,我收到一个 PHP 致命错误:达到“100”的最大函数嵌套级别,正在中止!在第 x 行的 file.php 中,所以我想查看它的堆栈跟踪以了解发生了什么。 PhpUnit 显示的是最终错误,而不是完整的跟踪。 @edorian:我偶尔会看到当 phpunit 的错误处理程序阻塞递归嵌套对象时会发生这种情况。如果它最终耗尽了输出缓冲区中的内存,您可能会没有任何痕迹(尽管仍然是错误日志中的一个条目)。 根据我的经验,您需要在您的情况下逐步遵循代码。 jerry rig 它可以在达到特定条件时停止代码和堆栈跟踪。 【参考方案1】:PHPUnit 使用错误处理函数来捕获和显示错误,但来自error handlers 上的 PHP 手册,
以下错误类型不能 使用用户定义的函数处理: E_ERROR、E_PARSE、E_CORE_ERROR、 E_CORE_WARNING,E_COMPILE_ERROR, E_COMPILE_WARNING 和大多数 E_STRICT 在文件中提出 调用 set_error_handler()。
如果您在单独的进程中运行测试,PHPUnit 将从解释器中获取错误和消息,但没有可用的堆栈跟踪。这只是 PHP 解释器的一个限制。致命的意思是致命的。
【讨论】:
【参考方案2】:这是一种蹩脚但有效的方法,当 php 不提供堆栈转储时,我发现它可以获取堆栈转储。我在一个名为 DebugUtil 的类中有这个。
/**
* This is for use when you have the UBER-LAME...
* "PHP Fatal error: Maximum function nesting level of '100' reached,
* aborting! in Lame.php(1273)
* ...which just craps out leaving you without a stack trace.
* At the line in the file where it finally spazzes out add
* something like...
* DebugUtil::dumpStack('/tmp/lame');
* It will write the stack into that file every time it passes that
* point and when it eventually blows up (and probably long before) you
* will be able to see where the problem really is.
*/
public static function dumpStack($fileName)
$stack = "";
foreach (debug_backtrace() as $trace)
if (isset($trace['file']) &&
isset($trace['line']) &&
isset($trace['class']) &&
isset($trace['function']))
$stack .= $trace['file'] . '#' .
$trace['line'] . ':' .
$trace['class'] . '.' .
$trace['function'] . "\n";
file_put_contents($fileName, $stack);
【讨论】:
以上是关于PhpUnit 未显示 php 致命错误的堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:未捕获的错误:调用 C:\xampp\htdocs\DBtest\sqlsrv.php:7 中的函数 sqlsrv_connect() 堆栈跟踪:#0 main SQLSERVER
如何修复 PHPUnit 中的“PHP 致命错误:未捕获的 TypeError:getTest() 参数”错误
PHP“致命错误:未捕获错误:调用成员函数prepare()为null”