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.



How do I configure it to do so?


Source: Tips4all

2 comments:

  1. 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.

    ReplyDelete
  2. 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);
    }

    ReplyDelete