PHPUnit Segmentation fault

2020-02-21 05:38发布

When a PHPUnit test fails normally on my dev box (Linux Mint), it causes a "Segmentation Fault" on my Continous Integration box (Centos). Both machines are running the same version of PHPUnit. My dev box is running PHP 5.3.2-1ubuntu4.9, and the CI is PHP 5.2.17. I'd rather leave upgrading the PHP as a last resort though.

As per this thread: PHPUnit gets segmentation fault I have tried deactivating / reinstalling Xdebug. I don't have inclue.so installed.

On the CI box I currently only have two extensions active: dom from php-xml (required for phpunit) and memcache (required by my framework), all the others have been turned off.

13条回答
孤傲高冷的网名
2楼-- · 2020-02-21 05:59

If anyone comes across this in relation to PHPunit within Laravel

It took a while to figure out what the issue was. I was going over the differences between my current code and the previous revision and through some trial and error finally got there.

I had two different models that were both including each other with the protected $with override.

This must have been causing some kind of loop that phpunit could not deal with.

Hopefully someone finds this useful.

查看更多
【Aperson】
3楼-- · 2020-02-21 06:00

I kept getting a Segmentation fault: 11 when running PHPUnit with Code coverage. After doing a stack trace of the segmentation fault, I found the following was causing the Segmentation fault error:

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

I replaced my current xdebug.so in the path above with the latest version from the Komodo Remote Debugging Package the sub-folder of the corresponding downloaded package with the PHP version I have (which is 5.5 for me) and everything worked.

查看更多
劫难
4楼-- · 2020-02-21 06:00

if you have an object with property pointing to the same object, or other sort of pointer loops, you will have this message while running

serialize($object);

And if you are a Laravel user, and you are dealing with models. And if you think, you will never have this problem, because you avoiding pointer loops by using $hidden property on your models, please be advised, the $hidden property does not affect serialize, it only affects casting to JSON and array.

I had this problem, when I had a model saved into a property of a Mailable object.

fixed with

$this->model->refresh(); 

in a __construct method , just before the whole object is serialized.

查看更多
我想做一个坏孩纸
5楼-- · 2020-02-21 06:08

I've had an issue with PHPUnit segfaulting and had trouble finding an answer, so hopefully this helps someone with the same issue later.

PHPUnit was segfaulting, but only:

  • If there was an error (or more than one)
  • After all tests had run but before the errors were printed

After a while I realized that it was due to failures on tests that used data providers, and specifically for data providers that passed objects with lots of recursive references. A bell finally went off and I did some digging: the problem is that when you're using data providers and a test fails, PHPUnit tries to create a string representation of the provided arguments for the failure description to tell you what failed, but this is problematic when one of the arguments has some infinite recursion. In fact, what PHPUnit does in PHPUnit_Framework_TestCase::dataToString() (around line 1612) is print out all the arguments provided by the data provider using print_r, which causes the segfault when PHP tries to create a string representation of the infinitely recursive object.

The solution I came to was:

  1. Use a single base class for all my test classes (which fortunately I was already doing)
  2. Override dataToString() in my test base class, to check for these kinds of objects in the data array (which is possible in my case because I know what these objects look like). If the object is present, I return some special value, if not I just pass it along to the parent method.
查看更多
叼着烟拽天下
6楼-- · 2020-02-21 06:09

This related to code not extension. In my case i had these two files

  1. Test Case
  2. Example Test

In Test Case there is method called createApplication. Just leave it empty.
In Example Test you can create the method and fill with $this->assertTrue(true)

Above is basic setup hope you can extend the requirement as you need.

查看更多
在下西门庆
7楼-- · 2020-02-21 06:10

I had similar problem and by disabling the garbge collactor in

PHPStorm => Edit configuration => Interpreter option : -d zend.enable_gc=0

Or if you are running your tests from the command line you may try adding :

-d zend.enable_gc=0

查看更多
登录 后发表回答