Ccna final exam - java, php, javascript, ios, cshap all in one. This is a collaboratively edited question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.
Tuesday, May 15, 2012
PhpUnit not showing a stack trace for a php fatal error
PhpUnit is currently not showing the stack trace for PHP errors that occur in the code.
PHPUnit uses an error handler function to trap and display errors, but from the PHP manual on error handlers,
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.
If you are running tests in a separate process, PHPUnit will get the error and message from the interpreter, but there will be no stack trace available. This is simply a limitation of the PHP interpreter. Fatal means fatal.
This is a lame yet effective way that I've found to get a stack dump when php doesn't give one. I have this in a classed called 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 uses an error handler function to trap and display errors, but from the PHP manual on error handlers,
ReplyDeleteThe following error types cannot be
handled with a user defined function:
E_ERROR, E_PARSE, E_CORE_ERROR,
E_CORE_WARNING, E_COMPILE_ERROR,
E_COMPILE_WARNING, and most of
E_STRICT raised in the file where
set_error_handler() is called.
If you are running tests in a separate process, PHPUnit will get the error and message from the interpreter, but there will be no stack trace available. This is simply a limitation of the PHP interpreter. Fatal means fatal.
This is a lame yet effective way that I've found to get a stack dump when php doesn't give one. I have this in a classed called DebugUtil.
ReplyDelete/**
* 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);
}