Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PhpUnit not showing a stack trace for a php fatal error

Tags:

php

phpunit

PhpUnit is currently not showing the stack trace for PHP errors that occur in the code.

How do I configure it to do so?

like image 240
bcmcfc Avatar asked May 13 '11 16:05

bcmcfc


2 Answers

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.

like image 90
David Harkness Avatar answered Oct 19 '22 14:10

David Harkness


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);
        }
like image 36
Al Sargent Avatar answered Oct 19 '22 14:10

Al Sargent