Ошибка сегментации PHPUnit - PullRequest
21 голосов
/ 14 июня 2011

Когда тест PHPUnit обычно не проходит на моем устройстве dev (Linux Mint), это вызывает «Сегментационную ошибку» на моем модуле непрерывной интеграции (Centos).На обеих машинах установлена ​​одна и та же версия PHPUnit.Мой dev box работает под управлением PHP 5.3.2-1ubuntu4.9, а CI - это PHP 5.2.17.Я бы предпочел оставить обновление PHP как последнее средство.

В соответствии с этим потоком: PHPUnit получает ошибку сегментации Я попытался деактивировать / переустановить Xdebug.У меня не установлено файл incl.были выключены.

Ответы [ 12 ]

23 голосов
/ 14 июня 2011

Помимо того, что предложил cweiske, если обновление PHP не является для вас вариантом, и у вас возникают проблемы с поиском источника segfault, вы можете использовать отладчик, чтобы узнать больше.

Вы можете запустить gdbэтот способ отладки сеанса PHPUnit:

gdb --args php /usr/bin/phpunit quiz_service_Test.php

Затем введите r для запуска программы и / или сначала установите переменные среды.

set env MALLOC_CHECK_=3
r

Вы также можете установитьсимволы отладки для PHP в системе, чтобы получить лучшие результаты для отладки.GDB проверяет это при запуске и оставляет уведомление, как вы можете это сделать.

16 голосов
/ 15 сентября 2012

У меня возникла проблема с segfaulting PHPUnit, и я не мог найти ответ, поэтому, надеюсь, это поможет кому-то с такой же проблемой позже.

PHPUnit был segfaulting, но только:

  • Если произошла ошибка (или более одной)
  • После того, как все тесты были выполнены, но до того, как ошибки были напечатаны

Через некоторое время я понял, что это из-за сбоевв тестах, в которых использовались поставщики данных, в частности, для поставщиков данных, которые передавали объекты с большим количеством рекурсивных ссылок.Наконец прозвенел звонок, и я немного покопался: проблема в том, что когда вы используете провайдеров данных и тест не пройден, PHPUnit пытается создать строковое представление предоставленных аргументов для описания ошибки, чтобы сообщить вам, что не удалось, но этопроблематично, когда один из аргументов имеет некоторую бесконечную рекурсию.Фактически, PHPUnit делает в PHPUnit_Framework_TestCase::dataToString() (вокруг строки 1612) вывод всех аргументов, предоставленных поставщиком данных, используя print_r, что вызывает segfault, когда PHP пытается создать строковое представление бесконечно рекурсивного объекта.

Решение, к которому я пришел, было:

  1. Использовать один базовый класс для всех моих тестовых классов (что, к счастью, я уже делал)
  2. Переопределить dataToString() вмой базовый тестовый класс для проверки объектов такого типа в массиве данных (что возможно в моем случае, потому что я знаю, как эти объекты выглядят).Если объект присутствует, я возвращаю какое-то специальное значение, если нет, я просто передаю его родительскому методу.
8 голосов
/ 05 августа 2016

У меня была похожая проблема, и, отключив сборщик мусора в

PHPStorm => Изменить конфигурацию => Параметр интерпретатора: -d zend.enable_gc = 0

Илиесли вы запускаете свои тесты из командной строки, вы можете попробовать добавить:

-d zend.enable_gc = 0

6 голосов
/ 14 июня 2011

Когда вы получаете segfault, обновите ваш PHP до последней версии.Не только последние в вашем менеджере пакетов, но и последние, доступные на php.net.Если это все еще происходит с ошибками, вы уверены, что проблема еще не решена в самом PHP.Не пытайтесь избавиться от segfault в старой версии PHP, потому что он мог быть уже исправлен в новой.

Следующий шаг - найти проблему: уменьшайте и уменьшайте тест до тех пор, поканичего не могу удалить (но это всё равно segfaults).Если у вас это есть, переместите тест в автономный скрипт php, который не работает.Теперь у вас есть тестовый скрипт для вашей ошибки в трекере ошибок PHP.

1 голос
/ 10 сентября 2018

Бесконечная рекурсия обычно является причиной этой проблемы для нас.Симптомы бесконечной рекурсии кажутся разными при запуске кода под phpunit, чем при запуске его в других средах.

1 голос
/ 13 августа 2017

У меня была та же проблема, и я смог ее решить, пытаясь написать переменную класса, которая не была определена:

Мой класс (это класс cakePHP), вызвавший ошибку сегментации:

class MyClass extends AppModel {

  protected $classVariableOne;

  public function __construct($id = false, $table = null, $ds = null) {
    parent::__construct($id, $table, $ds);

    $this->classVariableOne =& ClassRegistry::init('ClassVariableOne');

    // This line caused the segmentation fault as the variable doesn't exists
    $this->classVariableTwo =& ClassRegistry::init('ClassVariableTwo');

  }
}

Я исправил это, добавив вторую переменную:

class MyClass extends AppModel {

  protected $classVariableOne;
  protected $classVariableTwo; // Added this line

  public function __construct($id = false, $table = null, $ds = null) {
    parent::__construct($id, $table, $ds);

    $this->classVariableOne =& ClassRegistry::init('ClassVariableOne');
    $this->classVariableTwo =& ClassRegistry::init('ClassVariableTwo');

  }
}
0 голосов
/ 02 мая 2019

Если кто-нибудь сталкивался с этим в отношении PHPunit в Laravel

Потребовалось время, чтобы выяснить, в чем проблема. Я рассматривал различия между моим текущим кодом и предыдущей версией, и через пробу и ошибку наконец-то дошел.

У меня было две разные модели, которые обе включали друг друга с переопределением protected $with.

Это, должно быть, вызывало какой-то цикл, с которым phpunit не мог справиться.

Надеюсь, кто-то найдет это полезным.

0 голосов
/ 27 июня 2017

Это относится к коду, а не к расширению. В моем случае у меня были эти два файла

  1. Контрольный пример
  2. Пример теста

В Test Case есть метод с именем createApplication . Просто оставь это пустым.
В Пример теста вы можете создать метод и заполнить $ this-> assertTrue (правда)

Выше приведена базовая настройка, вы можете расширить требования по мере необходимости.

0 голосов
/ 24 октября 2016

В дополнение к https://stackoverflow.com/a/38789046/246790, которые мне очень помогли:

Вы можете использовать функцию PHP gc_disable();

Я также поместил его в код начальной загрузки PHPUnit с ini_set('memory_limit', -1);

0 голосов
/ 24 февраля 2015

Следующее исправило аналогичную проблему для меня (когда выходные данные gdb backtrace включали libcurl.so и libcrypto.so):

отключить /etc/php.d/pgsql.ini:

; Enable pgsql extension module
; extension=pgsql.so

edit /etc/php.d/curl.ini, чтобы убедиться, что pgsql.so включено перед curl:

; Enable curl extension module
extension=pgsql.so
extension=curl.so
curl.cainfo=/home/statcounter/include/config/cacert.pem
...