PHPUnit не показывает трассировку стека при фатальной ошибке php

#php #phpunit

#php #phpunit

Вопрос:

PHPUnit в настоящее время не показывает трассировку стека для ошибок PHP, возникающих в коде.

Как мне настроить его для этого?

Комментарии:

1. Не могли бы вы предоставить какой-нибудь пример кода, поскольку я не уверен, что правильно вас понял. (кажется, у меня это работает, возможно, я неправильно понял)

2. Как и в, я получаю PHP Fatal error: достигнут максимальный уровень вложенности функции ‘100’, прерывание! в file.php в строке x, поэтому я хочу просмотреть его трассировку стека, чтобы понять, что происходит. PHPUnit показывает последнюю ошибку, а не полную трассировку.

3. @edorian: Я иногда видел, как это происходило, когда обработчик ошибок phpunit захлебывается на рекурсивно вложенных объектах со ссылками друг на друга. Если в конечном итоге заканчивается нехватка памяти в выходном буфере, вы можете остаться без трассировки (хотя запись в журнале ошибок все еще остается).

4. по моему опыту, в вашей ситуации вам нужно будет следовать коду шаг за шагом.

5. джерри подстроил это, чтобы остановить код и трассировку стека, когда он достигает определенного состояния.

Ответ №1:

PHPUnit использует функцию обработчика ошибок для отслеживания и отображения ошибок, но из руководства 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'])  amp;amp;
                    isset($trace['line'])  amp;amp;
                    isset($trace['class']) amp;amp;
                    isset($trace['function']))
                {
                    $stack .= $trace['file']     . '#' .
                              $trace['line']     . ':' .
                              $trace['class']    . '.' .
                              $trace['function'] . "n";
                }
            }
            file_put_contents($fileName, $stack);
        }