【问题标题】:How to diagnose these PHP-Code-Coverage segmentation and zend_mm_heap corrupted errors如何诊断这些 PHP-Code-Coverage 分段和 zend_mm_heap 损坏错误
【发布时间】:2013-01-13 21:11:35
【问题描述】:

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

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

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

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

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

编辑:

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

【问题讨论】:

    标签: php segmentation-fault code-coverage


    【解决方案1】:

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

    添加:

    zend.enable_gc=0 
    

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

    phpunit -d zend.enable_gc=0
    

    【讨论】:

    • 要获得更多信息,您可以尝试使用 gdb 回溯。gdb php。在 gdb 中,run /usr/bin/phpunit。当 phpunit segfaults 输入bt。更多信息ofb.net/gnu/gdb/gdb_42.html
    • 布莱克,这是一个很大的帮助。如果我能给你一枚奖牌,我会的!
    • 哇!它为我节省了很多时间!
    • 但是禁用 gc 对内存安全吗?
    • @Hast 很可能不是。我想这被认为只是开发环境中的一种临时解决方法,因此内存安全并不是那么大的问题。
    【解决方案2】:

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

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

    $x = doSomething(doSomethingElse());
    

    并像这样将内部函数提取到变量中:

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

    解决了这个问题。上面的代码当然是简化的代码,但您应该理解有时代码中没有真正的错误,但您应该修改它以使具有代码覆盖率的 PhpUnit 为您的代码工作。

    【讨论】:

    • 我最近也遇到了同样的问题。你知道为什么会发生这种情况吗?我的意思是,这显然是 100% 有效的代码。这怎么会失败?
    • 我的情况类似:将 ``` DB::raw('(' . $this->getCommentCountQuery()->toSql() . ') AS fl_cmets_count') ``` 改为 ` `` DB::raw("($comment_count_query) AS fl_cmets_count") ``` 问题已解决。
    • 这次是另一种情况,从 ``` return SnappyPdf::loadHTML($this->renderHTML())... ``` 到 ``` $html = $this->renderHTML( );返回 SnappyPdf::loadHTML($html)...```
    【解决方案3】:

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

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

    【讨论】:

    • 这是我的解决方案
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2012-10-16
    • 2015-08-05
    • 2017-08-20
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多