PHPUnit分段错误

时间:2011-06-14 12:45:47

标签: php segmentation-fault phpunit

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

根据这个帖子:PHPUnit gets segmentation fault 我尝试过停用/重新安装Xdebug。我没有包含安装。

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

12 个答案:

答案 0 :(得分:23)

除了cweiske建议的内容之外,如果升级PHP不适合您,并且您无法找到段错误的来源,则可以使用调试器来了解更多信息。

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

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

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

set env MALLOC_CHECK_=3
r

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

答案 1 :(得分:7)

我有类似的问题,并且在

中禁用了garbge collactor
  

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

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

  

-d zend.enable_gc = 0

答案 2 :(得分:6)

当您遇到段错误时,请将PHP升级到最新版本。不仅是您的软件包管理器中的最新软件,还有php.net上的最新软件。如果它仍然是段错误,你确定问题还没有在PHP本身修复。不要试图摆脱旧版PHP中的段错误,因为它可能已经在较新版本中修复过。

下一步是找出问题:让你的测试越来越小,直到你无法移除任何东西(但它仍然是段错误)。如果你有这个,将测试移动到一个独立的php脚本,segfaults。现在,您可以在PHP错误跟踪器中找到错误的测试脚本。

答案 3 :(得分:1)

我遇到了同样的问题,可能会把它钉死,我试图写一个没有定义的类变量:

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

  }
}

答案 4 :(得分:1)

无限递归通常是导致我们遇到此问题的原因。在phpunit下运行代码时,无限递归的症状似乎有所不同,而在其他环境中运行时则无济于事。

答案 5 :(得分:0)

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

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

答案 6 :(得分: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)并且一切顺利。

答案 7 :(得分:0)

以下针对我解决了类似的问题(当gdb回溯的输出包括libcurl.solibcrypto.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

答案 8 :(得分:0)

除了https://stackoverflow.com/a/38789046/246790之外,还有很多帮助我:

您可以使用PHP函数gc_disable();

我已将它放在我的PHPUnit引导代码中以及ini_set('memory_limit', -1);

答案 9 :(得分:0)

如果有人在Laravel中遇到有关PHPunit的问题

花了一段时间才找出问题所在。我正在研究当前代码与先前版本之间的差异,并通过一些反复试验终于达到了目标。

我有两个不同的模型,两个模型都以protected $with覆盖彼此。

这一定是导致phpunit无法处理的某种循环。

希望有人发现它有用。

答案 10 :(得分:0)

如果您的对象具有指向同一对象的属性或其他类型的指针循环,则在运行时会显示此消息

serialize($object);

如果您是Laravel用户,并且正在处理模型。而且如果您认为,您将永远不会遇到这个问题,因为请注意,通过在模型上使用$hidden属性可以避免指针循环,$hidden属性不会影响serialize,仅影响投射到JSONarray

当我将模型保存到Mailable对象的属性中时,我遇到了这个问题。

固定为

$this->model->refresh(); 

__construct方法中,即将整个对象序列化之前。

答案 11 :(得分:-2)

这与代码不扩展有关。在我的情况下,我有这两个文件

  1. 测试用例
  2. 示例测试
  3. 测试用例中,有一个名为 createApplication 的方法。把它留空吧。
    示例测试中,您可以创建方法并填写 $这 - > assertTrue(真)

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