Подтвердить что ты не робот

Ошибка сегментации PHPUnit

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

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

В ящике CI в настоящее время активны только два расширения: dom из php-xml (требуется для phpunit) и memcache (требуется для моей рамки), все остальные отключены.

4b9b3361

Ответ 1

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

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

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

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

set env MALLOC_CHECK_=3
r

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

-d zend.enable_gc = 0

Ответ 4

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

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

Ответ 5

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

Мой класс (это класс 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');

  }
}

Ответ 6

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

Ответ 7

У меня возникла та же проблема. Я обновил PHPUnit до версии 4.1 (чтобы запустить тесты), и он смог показать мне объект, как указал Исаак.

Итак, если вы дойдете до этой же проблемы, перейдите на PHPUnit >= 4.1, и вы сможете увидеть эту ошибку вместо получения сообщения "Ошибка сегментации".

Ответ 8

Я продолжал получать Segmentation fault: 11 при запуске PHPUnit с охватом кода. После выполнения трассировки стека ошибки сегментации, я обнаружил, что следующее вызывает ошибку ошибки сегментации:

Program received signal SIGSEGV, Segmentation fault.
0x0000000100b8421a in xdebug_path_info_get_path_for_level () from /usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so

Я заменил текущий текущий xdebug.so на предыдущем пути с последней версией Komodo Remote Debugging Package в подпапку соответствующего загруженный пакет с версией PHP, которую я имею (для меня это 5.5), и все сработало.

Ответ 9

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

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

; Enable pgsql extension module
; extension=pgsql.so

отредактируйте /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

Ответ 10

В дополнение к fooobar.com/questions/321560/..., который мне очень помог:

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

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

Ответ 11

Если кто-то сталкивается с этим в связи с PHPunit в Laravel

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

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

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

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

Ответ 12

если у вас есть объект со свойством, указывающим на тот же объект, или циклы указателя другого типа, у вас будет это сообщение при выполнении

serialize($object);

А если вы пользователь Laravel и вы имеете дело с моделями. И если вы думаете, что у вас никогда не возникнет этой проблемы, потому что вы избегаете циклов указателя, используя свойство $hidden в своих моделях, имейте в виду, что свойство $hidden не влияет на serialize, оно влияет только на приведение к JSON и array.

У меня была эта проблема, когда у меня была модель, сохраненная в свойство объекта Mailable.

исправлено с помощью

$this->model->refresh(); 

в методе __construct, непосредственно перед сериализацией всего объекта.

Ответ 13

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

  • Тестовый пример
  • Пример теста

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

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