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