PHPUnit分段错误
当PHPUnit测试在我的dev box(linuxmint)上正常失败时,它会在我的continuousintegration box(Centos)上导致“分段错误”。这两台机器运行的是同一版本的PHPUnit。我的dev box运行的是php5.3.2-1ubuntu4.9,CI是php5.2.17。我宁愿把升级PHP作为最后的手段 按照这个思路: 我已尝试停用/重新安装Xdebug。我没有安装include.soPHPUnit分段错误,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
在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\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();