PHPUnit分段错误

Rud*_*uch 24 php phpunit segmentation-fault

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

根据这个线程:PHPUnit得到分段错误 我已经尝试停用/重新安装Xdebug.我没有inclue.so安装.

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

hak*_*kre 24

在cweiske建议的旁边,如果升级PHP不适合您,并且您无法找到段错误的来源,则可以使用调试器来查找更多信息.

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

gdb --args php /usr/bin/phpunit quiz_service_Test.php
Run Code Online (Sandbox Code Playgroud)

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

set env MALLOC_CHECK_=3
r
Run Code Online (Sandbox Code Playgroud)

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


Isa*_*aac 17

我遇到了PHPUnit segfaulting的问题,但很难找到答案,所以希望这可以帮助以后遇到同样问题的人.

PHPUnit是segfaulting,但仅限于:

  • 如果有错误(或多个)
  • 在所有测试运行之后但是在打印错误之前

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

我找到的解决方案是:

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

  • 这实际上有很大帮助。一种更好的方法是在测试本身中创建数据结构,并在数据提供程序中仅创建纯数据(这对我有用) (2认同)

Moh*_*iri 9

我有类似的问题,并通过禁用garbge collactor

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

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

-d zend.enable_gc = 0


cwe*_*ske 7

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

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