如何诊断这些 PHP 代码覆盖率分段和zend_mm_heap损坏的错误


How to diagnose these PHP-Code-Coverage segmentation and zend_mm_heap corrupted errors

我一直很高兴在我的 Ubuntu 机器上编码。 这是一台具有大量RAM的强大机器。 我正在研究 4 个新类,边走边编写和运行单元测试。 在某些时候,我注意到,虽然单元测试完成得很好,但代码覆盖率却没有。

在消息"正在生成代码覆盖率报告...等等。我会收到一条消息,说zend_mm_heap已损坏。 我尝试了一些修复,包括:在我的php.ini(apache2和cli)中设置output_buffering = On,以及从我的代码中删除对unset()的调用。 (我阅读了,所以可能需要这些修复)。

现在,无论我做什么,我似乎都会在zend_mm...错误和分段错误(核心转储)错误之间交替。 我注释掉测试,直到缩小我认为导致问题的测试范围,并在那里进行一些更改,直到我干净运行。 然后,我将取消注释所有测试,只是为了发现故障仍然发生。

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

我正在使用PHP_CodeCoverage 1.2.6、PHP 5.3.10-1ubuntu3.5、PHPUnit 3.7.9。

编辑:

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

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

加:

zend.enable_gc=0 

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

phpunit -d zend.enable_gc=0
有时很难

理解在运行具有代码覆盖率的 PhpUnit 时出现的分段错误。我在 PHP 7.0.5 上使用 2 个版本的 PhpUnit 时遇到了分段错误。

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

$x = doSomething(doSomethingElse());

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

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

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

我遇到了同样的问题并尝试使用 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>

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