2011-06-14 146 views
16

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

按照此线程:PHPUnit gets segmentation fault 我试过去激活/重新安装Xdebug。我没有inclue.so安装。

在配置框上,我目前只有两个扩展活动:php-xml(phpunit需要)和memcache(我的框架需要)的dom,所有其他都已关闭。

+1

请你展示如何调用PHPUnit的。你有没有尝试过程隔离? – hakre 2011-06-14 12:52:53

+0

内存不足? – powtac 2011-06-14 12:53:22

+0

@hakre - 是的,我已经尝试过程隔离,我得到的所有错误都是由于我的框架未正确实例化。我只是简单地从命令行调用它:phpunit quiz_service_Test.php – 2011-06-14 12:55:35

回答

21

除了cweiske的建议之外,如果升级PHP不适合您,并且您有找到segfault源的问题,您可以使用调试器来了解更多信息。

可以启动GDB这种方式来调试PHPUnit的会话:

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

然后输入r先运行程序和/或设置环境变量。

set env MALLOC_CHECK_=3 
r 

您也可以考虑在系统上安装PHP的调试符号以获得更好的调试结果。 gdb会在启动时为你检查,并留下一个通知你如何做到这一点。

+0

谢谢,这帮助我缩小范围。我们从服务器获取的数据对于pcre来说太大了。 – 2011-06-14 13:58:06

+0

好的。您可以限制它,以便preg _...不会segfault,但也不会完全执行(如果失败,通常会返回NULL)。 [查看pcre的ini设置](http://php.net/manual/en/pcre.configuration.php)。 – hakre 2011-06-14 13:59:58

6

当您遇到段错误时,请将您的PHP升级到最新版本。不仅是你的软件包管理器中的最新版本,而且是php.net上的最新版本。如果它仍然存在段错误,那么您确定该问题在PHP本身中尚未得到修复。不要打扰在老版本的PHP中摆脱段错误,因为它可能已经被更新了。

下一步是定位问题:让你的测试越来越小,直到你不能删除任何东西(但它仍然是段错误)。如果你有这个问题,把测试移动到一个独立的php脚本中。现在你有一个PHP错误跟踪器中的bug的测试脚本。

14

我遇到了PHPUnit segfaulting的问题,并且无法找到答案,所以希望这可以帮助稍后出现相同问题的人。

PHPUnit的是段错误,但仅限于:

  • 如果有错误(或多个)
  • 所有的测试都运行后,但被印刷前的错误

后而我意识到这是由于使用数据提供者的测试失败,特别是数据提供者传递带有大量递归引用的对象的原因。一声钟终于熄灭了,我做了一些挖掘:问题在于,当您使用数据提供程序并且测试失败时,PHPUnit会尝试创建一个提供的失败描述参数的字符串表示形式,以告诉您什么失败了,但是这当其中一个参数有一些无限递归时是有问题的。实际上,PHPUnit在PHPUnit_Framework_TestCase::dataToString()(第1612行左右)中的功能是使用print_r打印数据提供者提供的所有参数,当PHP尝试创建无限递归对象的字符串表示形式时会导致段错误。

我来的解决方案是:

  1. 用我所有的测试类单基类(幸好我已经在做)
  2. 覆盖dataToString()在我的测试基类,以检查这些数据数组中的各种对象(在我的情况下可能是这样,因为我知道这些对象是什么样的)。如果对象存在,我会返回一些特殊的值,如果不是,我只是将它传递给父方法。
+1

实际上帮了很多。一种更好的方法是在测试本身中创建数据结构,并在dataprovider中创建纯数据(这对我来说很有用) – 2013-01-21 16:50:26

0

我陷入了同样的问题。我将PHPUnit升级到4.1版本(运行测试),它能够向我展示Isaac指出的对象。

所以,如果你遇到这个问题,升级到PHPUnit> = 4.1,你将能够看到错误,而不是得到“Segmentation fault”消息。

0

运行带代码覆盖率的PHPUnit时,我不断收到Segmentation fault: 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在上述路径从Komodo Remote Debugging Package的子文件夹中的最新版本相应的下载包与我有的PHP版本(对我来说是5.5),一切正常。

0

以下固定一个类似的问题,我(当gdb回溯的输出包括libcurl.solibcrypto.so):

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

; Enable pgsql extension module 
; extension=pgsql.so 

编辑/etc/php.d/curl.ini确保pgsql.so被卷曲之前包括:

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

我h广告类似的问题,在

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

禁用garbge collactor或者,如果你在命令行运行测试,你可以尝试添加:

-d zend.enable_gc=0

-1

这与代码不相关。在我来说,我有这两个文件

  1. 测试用例
  2. 实例测试

测试用例有方法称为createApplication。只是把它留空。
实例测试您可以创建方法并用 $这个 - > assertTrue(TRUE)

以上是基本的设置希望,因为你需要,你可以扩展的要求填写。

1

我有同样的问题,可以钉下来,我试着写这是不definied类变量:

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

    } 
}