Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit分段错误_Php_Segmentation Fault_Phpunit - Fatal编程技术网

PHPUnit分段错误

PHPUnit分段错误,php,segmentation-fault,phpunit,Php,Segmentation Fault,Phpunit,当PHPUnit测试在我的dev box(linuxmint)上正常失败时,它会在我的continuousintegration box(Centos)上导致“分段错误”。这两台机器运行的是同一版本的PHPUnit。我的dev box运行的是php5.3.2-1ubuntu4.9,CI是php5.2.17。我宁愿把升级PHP作为最后的手段 按照这个思路: 我已尝试停用/重新安装Xdebug。我没有安装include.so 在CI框中,我目前只有两个扩展处于活动状态:来自php xml的dom(p

当PHPUnit测试在我的dev box(linuxmint)上正常失败时,它会在我的continuousintegration box(Centos)上导致“分段错误”。这两台机器运行的是同一版本的PHPUnit。我的dev box运行的是php5.3.2-1ubuntu4.9,CI是php5.2.17。我宁愿把升级PHP作为最后的手段

按照这个思路: 我已尝试停用/重新安装Xdebug。我没有安装include.so


在CI框中,我目前只有两个扩展处于活动状态:来自php xml的dom(phpunit所需)和memcache(我的框架所需),所有其他扩展都已关闭。

如果出现segfault,请将php升级到最新版本。不仅是包管理器中的最新版本,而且是php.net上提供的最新版本。如果它仍然存在故障,那么您可以肯定PHP本身还没有解决这个问题。不要费心在旧版本的PHP中删除segfault,因为它可能已经在新版本中修复了


下一步是找出问题所在:将测试变得越来越小,直到您无法删除任何内容(但仍然存在故障)。如果您有这个功能,请将测试转移到一个独立的php脚本中,该脚本可以自动识别错误。现在,您在PHP bug跟踪器中有了一个bug测试脚本。

在cweiske建议的内容旁边,如果升级PHP不是您的选项,并且您在查找SEGFULT源时遇到问题,您可以使用调试器来了解更多信息

您可以通过以下方式启动gdb以调试PHPUnit会话:

gdb --args php /usr/bin/phpunit quiz_service_Test.php
然后键入
r
以首先运行程序和/或设置环境变量

set env MALLOC_CHECK_=3
r

您还可以考虑在系统上安装PHP的调试符号,以便获得更好的调试结果。gdb会在启动时为您检查此问题,并通知您如何执行此操作。

我遇到了PHPUnit segfaulting的问题,并且很难找到答案,因此希望这能帮助以后遇到相同问题的人

PHPUnit是断层,但只是:

  • 如果有错误(或多个错误)
  • 在所有测试运行之后但在打印错误之前
过了一段时间,我意识到这是由于使用数据提供程序的测试失败,特别是对于传递带有大量递归引用的对象的数据提供程序。铃声终于响了,我做了一些挖掘:问题是,当您使用数据提供程序并且测试失败时,PHPUnit尝试为失败描述创建所提供参数的字符串表示,以告诉您失败的原因,但当其中一个参数具有某种无限递归时,这是有问题的。事实上,PHPUnit在
PHPUnit\u Framework\u TestCase::dataToString()
(第1612行附近)中所做的是使用
print\r
打印数据提供程序提供的所有参数,这会在PHP尝试创建无限递归对象的字符串表示时导致segfault

我找到的解决办法是:

  • 对我的所有测试类使用一个基类(幸运的是,我已经这样做了)
  • 在我的测试基类中重写
    dataToString()
    ,以检查数据数组中的这些类型的对象(在我的例子中这是可能的,因为我知道这些对象是什么样子)。如果对象存在,则返回一些特殊值,如果不存在,则将其传递给父方法

  • 我也遇到了同样的问题。我将PHPUnit升级到4.1版本(以运行测试),它能够向我显示对象,正如Isaac所指出的


    因此,如果您遇到同样的问题,升级到PHPUnit>=4.1,您将能够看到错误,而不是获得“分段错误”消息。

    在代码覆盖率下运行PHPUnit时,我一直得到一个分段错误:11。在对分段错误进行堆栈跟踪后,我发现以下是导致分段错误的原因:

    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
    ,并使用了我的PHP版本(对我来说是5.5版),一切正常

    下面为我修复了一个类似的问题(当
    gdb
    回溯的输出包括
    libcurl.so
    libcrypto.so
    时):

    禁用
    /etc/php.d/pgsql.ini

    ; Enable pgsql extension module
    ; extension=pgsql.so
    
    编辑
    /etc/php.d/curl.ini
    以确保在curl之前包含
    pgsql.so

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

    我也有类似的问题,通过在中禁用garbge collator

    PHPStorm=>编辑配置=>解释器选项:-d zend.enable_gc=0

    或者,如果您正在从命令行运行测试,则可以尝试添加:

    -d zend.enable_gc=0

    除此之外,这对我帮助很大:

    您可以使用PHP函数
    gc_disable()


    我已经把它放在我的PHPUnit引导代码中,以及
    ini\u集('memory\u limit',-1)

    此代码与扩展名无关。就我而言,我有这两份文件

  • 测试用例
  • 示例测试
  • 在测试用例中,有一个名为createApplication的方法。就让它空着吧。
    示例测试中可以创建方法并填充 $this->assertTrue(true)


    以上是基本设置,希望您可以根据需要扩展需求。

    我遇到了同样的问题,可以解决,我试图编写一个未定义的类变量:

    我的类(它是一个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');
    
      }
    }
    

    无限递归通常是导致这个问题的原因。在phpunit下运行代码时,无限递归的症状似乎与在其他环境中运行代码时不同。

    如果有人在Laravel中遇到与phpunit相关的问题

    花了一段时间才弄清问题所在。我正在看电视
    serialize($object);
    
    $this->model->refresh();