doufu1939
2011-06-14 12:45
浏览 158
已采纳

PHPUnit分段错误

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.

图片转代码服务由CSDN问答提供 功能建议

当我的开发箱(Linux Mint)上的PHPUnit测试正常失败时,它会导致我的“分段错误” 连续集成框(Centos)。 两台机器都运行相同版本的PHPUnit。 我的开发框运行PHP 5.3.2-1ubuntu4.9,CI为PHP 5.2.17。 我宁愿放弃升级PHP作为最后的手段。

根据这个帖子: PHPUnit会出现分段错误 我尝试停用/重新安装Xdebug。 我没有安装包含。

在CI框中,我目前只有两个活动扩展:dom来自php-xml(phpunit需要)和memcache(我的框架需要) ),所有其他人都被关闭了。

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

13条回答 默认 最新

  • doumiang2297 2011-06-14 13:16
    已采纳

    Next to what cweiske suggested, if upgrading PHP is not an option for you and you have problems to locate the source of the segfault, you can use a debugger to find out more.

    You can launch gdb this way to debug a PHPUnit session:

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

    Then type in r to run the program and/or set environment variables first.

    set env MALLOC_CHECK_=3
    r
    

    You might also consider to install the debugging symbols for PHP on the system to get better results for debugging. gdb checks this on startup for you and leaves a notice how you can do so.

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • doutenglou6588 2011-06-14 13:09

    When you get a segfault, upgrade your PHP to the latest version. Not only the latest in your package manager, but the latest available on php.net. If it still segfaults, you are sure that the problem has not been fixed yet in PHP itself. Don't bother trying to get rid of a segfault in old version of PHP because it might have been fixed already in a newer one.

    Next step is to locating the problem: Make your test smaller and smaller until you can't remove anything (but it still segfaults). If you have that, move the test into a standalone php script that segfaults. Now you have a test script for your bug in the PHP bug tracker.

    评论
    解决 无用
    打赏 举报
  • donglu4159 2012-09-15 05:56

    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.
    评论
    解决 无用
    打赏 举报
  • dongu189744321158 2014-08-03 23:45

    I got into the same problem. I upgraded the PHPUnit to the 4.1 version (to run the tests) and it was able to show me the object, as pointed by Isaac.

    So, if you get to this very same problem, upgrade to PHPUnit >= 4.1 and you'll be able to see the error instead of getting "Segmentation fault" message.

    评论
    解决 无用
    打赏 举报
  • douliao5942 2014-11-24 23:58

    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.

    评论
    解决 无用
    打赏 举报
  • doujianwan7570 2015-02-24 17:11

    The following fixed a similar issue for me (when the output of the gdb backtrace included libcurl.so and libcrypto.so):

    disable /etc/php.d/pgsql.ini:

    ; Enable pgsql extension module
    ; extension=pgsql.so
    

    edit /etc/php.d/curl.ini to ensure that pgsql.so is included before curl:

    ; Enable curl extension module
    extension=pgsql.so
    extension=curl.so
    curl.cainfo=/home/statcounter/include/config/cacert.pem
    
    评论
    解决 无用
    打赏 举报
  • duanbo6482 2016-08-05 12:16

    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

    评论
    解决 无用
    打赏 举报
  • dsdzz04802 2016-10-23 21:31

    In addition to https://stackoverflow.com/a/38789046/246790 which helped me a lot:

    You can use PHP function gc_disable();

    I have placed it in my PHPUnit bootstrap code as well with ini_set('memory_limit', -1);

    评论
    解决 无用
    打赏 举报
  • dsfds656545 2017-06-27 04:48

    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.

    评论
    解决 无用
    打赏 举报
  • dongsanhu4784 2017-08-13 14:33

    I had the same problem and could nail it down, that I tried to write a class variable which was not definied:

    My class (it's a cakePHP-class) which caused segmentation fault:

    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');
    
      }
    }
    

    I fixed it by adding the second variable:

    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');
    
      }
    }
    
    评论
    解决 无用
    打赏 举报
  • dongzhong2674 2018-09-10 02:31

    Infinite recursion is normally what causes this issue for us. The symptoms of infinite recursion seem to be different when running code under phpunit, than they are when running it in other environments.

    评论
    解决 无用
    打赏 举报
  • doulifang5554 2019-05-02 15:15

    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.

    评论
    解决 无用
    打赏 举报
  • donglun1918 2019-08-19 08:47

    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.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题