当我的开发箱(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(我的框架需要),所有其他扩展都已关闭。
答案 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 collactorPHPStorm =>编辑配置=>解释器选项:-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.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
答案 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
,仅影响投射到JSON
和array
。
当我将模型保存到Mailable
对象的属性中时,我遇到了这个问题。
固定为
$this->model->refresh();
在__construct
方法中,即将整个对象序列化之前。
答案 11 :(得分:-2)
这与代码不扩展有关。在我的情况下,我有这两个文件
在测试用例中,有一个名为 createApplication 的方法。把它留空吧。
在示例测试中,您可以创建方法并填写
$这 - > assertTrue(真)
以上是基本设置,希望您可以根据需要扩展需求。