如何诊断这些PHP-Code-Coverage分段和zend_mm_heap损坏的错误

时间:2013-01-30 05:43:56

标签: php segmentation-fault code-coverage

我很乐意在我的Ubuntu机器上编码。这是一台拥有充足内存的强大机器。我正在研究4个新课程,编写和运行单元测试。在某些时候我注意到,虽然单元测试完成得很好,但代码覆盖率却没有。

在消息“生成代码覆盖率报告...等...”之后,我会收到一条消息,指出zend_mm_heap已损坏。我尝试了一些修复,包括:在我的php.ini(包括apache2和cli)中设置output_buffering = On,并从我的代码中删除对unset()的调用。 (我在SO上阅读这些修复可能是必需的。)

现在,无论我做什么,我似乎在zend_mm ...错误和Segmentation fault(核心转储)错误之间交替。我评论测试,直到我缩小我认为导致问题的那个,并在那里做一些改变,直到我得到一个干净的运行。然后我将取消注释所有测试,只是发现故障仍然存在。

有什么想法吗?我可以使用哪些工具或方法来收集更多信息?

我使用的是PHP_CodeCoverage 1.2.6,PHP 5.3.10-1ubuntu3.5,PHPUnit 3.7.9。

编辑:

顺便说一句,我找不到任何核心转储文件。从我的物理磁盘的根目录搜索没有运气。我已经阅读了关于核心的man条目,包括核心转储没有创建文件的可能原因,但我认为这些都不适用。

3 个答案:

答案 0 :(得分:23)

我最近遇到了同样的问题。它似乎是PHP垃圾收集的问题。在phpunit运行期间禁用垃圾收集解决了我的问题。

添加:

zend.enable_gc=0 

到您的php.ini文件或从命令行:

phpunit -d zend.enable_gc=0

答案 1 :(得分:3)

在运行具有代码覆盖率的PhpUnit时,有时很难理解Segmentation fault错误。我在PHP 7.0.5上有2个版本的PhpUnit的分段错误。

最后,在我的情况下跟踪问题后,这样的事情导致了分段错误

$x = doSomething(doSomethingElse());

并将内部函数提取到变量中,如下所示:

$y = doSomethingElse();
$x = doSomething($y);

解决了这个问题。在上面它当然是简化的代码,但你应该理解你的代码中没有真正的错误,但你应该修改它以使代码覆盖的PhpUnit适用于你的代码。

答案 2 :(得分:1)

我有同样的问题,并尝试使用zend.enable_gc = 0,但然后phpunit内存不足。为了解决这个问题,我基本上将我的覆盖白名单修改为更精细。所以,在phpunit.xml中,我之前有过这个:

<filter>
    <whitelist>
        <directory suffix=".php">../application/src</directory>
    </whitelist>
</filter>

我把它更改为:

<filter>
    <whitelist>
        <directory suffix=".php">../application/src/module1</directory>
        <directory suffix=".php">../application/src/module2</directory>
        <directory suffix=".php">../application/src/module3</directory>
        <exclude>
            <directory>../application/src/module1/views</directory>
        </exclude>

    </whitelist>
</filter>

因此,只需尝试将过滤器限制为仅包含实际重要的文件。它仍然是一个错误,但是现在我认为限制考虑覆盖率计算的文件数量将有助于防止这类问题。