“zend_mm_heap 损坏”是什么意思

2023-11-21

突然之间,我的应用程序出现了以前从未遇到过的问题。我决定检查 Apache 的错误日志,发现一条错误消息“zend_mm_heap 损坏”。这是什么意思。

操作系统:Fedora Core 8 阿帕奇:2.2.9 PHP:5.2.6


这不是一个可以通过更改配置选项来解决的问题。

更改配置选项有时会产生积极影响,但也很容易使事情变得更糟,或者根本不起作用。

错误的本质是这样的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    void **mem = malloc(sizeof(char)*3);
    void *ptr;

    /* read past end */
    ptr = (char*) mem[5];   

    /* write past end */
    memcpy(mem[5], "whatever", sizeof("whatever"));

    /* free invalid pointer */
    free((void*) mem[3]);

    return 0;
}

上面的代码可以通过以下方式编译:

gcc -g -o corrupt corrupt.c

使用 valgrind 执行代码,您可以看到许多内存错误,最终导致分段错误:

krakjoe@fiji:/usr/src/php-src$ valgrind ./corrupt
==9749== Memcheck, a memory error detector
==9749== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==9749== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==9749== Command: ./corrupt
==9749== 
==9749== Invalid read of size 8
==9749==    at 0x4005F7: main (an.c:10)
==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
==9749== 
==9749== Invalid read of size 8
==9749==    at 0x400607: main (an.c:13)
==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
==9749== 
==9749== Invalid write of size 2
==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9749==    by 0x40061B: main (an.c:13)
==9749==  Address 0x50 is not stack'd, malloc'd or (recently) free'd
==9749== 
==9749== 
==9749== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==9749==  Access not within mapped region at address 0x50
==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9749==    by 0x40061B: main (an.c:13)
==9749==  If you believe this happened as a result of a stack
==9749==  overflow in your program's main thread (unlikely but
==9749==  possible), you can try to increase the size of the
==9749==  main thread stack using the --main-stacksize= flag.
==9749==  The main thread stack size used in this run was 8388608.
==9749== 
==9749== HEAP SUMMARY:
==9749==     in use at exit: 3 bytes in 1 blocks
==9749==   total heap usage: 1 allocs, 0 frees, 3 bytes allocated
==9749== 
==9749== LEAK SUMMARY:
==9749==    definitely lost: 0 bytes in 0 blocks
==9749==    indirectly lost: 0 bytes in 0 blocks
==9749==      possibly lost: 0 bytes in 0 blocks
==9749==    still reachable: 3 bytes in 1 blocks
==9749==         suppressed: 0 bytes in 0 blocks
==9749== Rerun with --leak-check=full to see details of leaked memory
==9749== 
==9749== For counts of detected and suppressed errors, rerun with: -v
==9749== ERROR SUMMARY: 4 errors from 3 contexts (suppressed: 0 from 0)
Segmentation fault

如果你不知道,你已经知道了mem是堆分配的内存;堆是指程序在运行时可用的内存区域,因为程序明确请求它(在我们的例子中使用 malloc)。

如果您使用这些糟糕的代码,您会发现并非所有这些明显不正确的语句都会导致分段错误(致命的终止错误)。

我在示例代码中明确地犯了这些错误,但是在内存管理环境中很容易发生相同类型的错误:例如,如果某些代码没有以正确的方式维护变量(或其他符号)的引用计数如果它释放得太早,另一段代码可能会从已经释放的内存中读取,如果它以某种方式存储了错误的地址,另一段代码可能会写入无效的内存,它可能会被释放两次......

这些不是可以在 PHP 中调试的问题,它们绝对需要内部开发人员的注意。

行动方针应该是:

  1. Open a bug report on http://bugs.php.net
    • 如果您有段错误,请尝试提供回溯
    • 包含尽可能多的配置信息,尤其是当您使用 opcache 时,包含优化级别。
    • 继续检查错误报告是否有更新,可能需要更多信息。
  2. If you have opcache loaded, disable optimizations
    • 我并不是选择 opcache,它很棒,但已知它的一些优化会导致错误。
    • 如果这不起作用,即使您的代码可能较慢,也请先尝试卸载 opcache。
    • 如果其中任何一个更改或解决了问题,请更新您所做的错误报告。
  3. Disable all unnecessary extensions at once.
    • 开始单独启用所有扩展,并在每次配置更改后进行彻底测试。
    • 如果您发现问题扩展,请使用更多信息更新您的错误报告。
  4. Profit.

可能没有任何利润...我一开始就说过,你也许可以通过搞乱配置找到一种方法来改变你的症状,但这非常碰运气,下次你再遇到这种情况时就没有帮助了。相同zend_mm_heap corrupted消息,只有这么多配置选项。

当我们发现错误时,创建错误报告非常重要,我们不能假设下一个遇到错误的人会这样做......更有可能的是,实际的解决方案绝不是神秘的,如果你让正确的人意识到了这个问题。

USE_ZEND_ALLOC

如果你设置USE_ZEND_ALLOC=0在环境中,这会禁用 Zend 自己的内存管理器; Zend 的内存管理器确保每个请求都有自己的堆,所有内存在请求结束时都被释放,并针对分配适合 PHP 大小的内存块进行了优化。

禁用它将会禁用这些优化,更重要的是,它可能会造成内存泄漏,因为有很多扩展代码依赖于 Zend MM 在请求结束时为它们释放内存(啧啧)。

也可能是hide症状,但系统堆可能会以与 Zend 堆完全相同的方式被损坏。

看似宽容一些,或许宽容一些,但要解决问题的根源,这不可以.

完全禁用它的能力是为了内部开发人员的利益;你应该never在禁用 Zend MM 的情况下部署 PHP。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“zend_mm_heap 损坏”是什么意思 的相关文章

  • mysqli_connect(): (HY000/2002): 无法建立连接,因为目标机器主动拒绝

    我知道有很多这样的问题 但我没有找到任何解决方案 我尝试过的事情 检查防火墙 重新启动我的电脑和 Apache 服务器 重新启动MYSQL 检查了我的代码 尝试了我所知道的和在互联网上找到的一切 这是我的代码
  • PHP 中 while (true){ 是什么意思?

    我看过这段代码 但不知道这意味着什么 while true echo Hello world 我知道什么是 while 循环 但是 while true 是什么意思 会执行多少次 这不是无限循环吗 虽然是无限循环 但您可以使用以下命令退出它
  • 正则表达式检查确切的字符串是否存在,包括#

    新问题正如 Asaph 在上一个问题中所建议的 正则表达式检查确切的字符串是否存在 https stackoverflow com questions 2824291 regex to check if exact string exist
  • /bootstrap/start.php 中的 Laravel 错误:\Illuminate\Foundation\Application 未找到

    因此 我在开发服务器上安装了 Laravel php5 5 3 标准安装 安装了 mcrypt 并收到以下错误消息 Fatal error Class Illuminate Foundation Application not found
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请
  • Mailchimp 自动化多次发送同一封电子邮件

    我在登陆页面上使用 mailchaimp 自动化工作流程向我的客户发送电子邮件 自动化工作流程是 客户在我的表格中输入他的电子邮件 使用 api V3 将客户添加到我的 mailchimp 列表 或更新 如果已存在 我使用此触发器调用发送第
  • openssl_crypt 中初始化向量的使用

    我看了一下this https stackoverflow com questions 1391132 two way encryption in php问题 并想为自己做 当我运行这段代码时 直接取自这个答案 https stackove
  • 表单请求中的 Laravel 数组验证

    我无法验证 Form Request 类中包含数组元素的字段 规则方法 public function rules return state gt required state 0 gt required state gt required
  • 此集合实例 Laravel 关系中不存在属性 [X]

    我在 Laravel 5 6 中使用了很多 Realtions 当我添加 phonebooks 时 我看到所有关系都工作正常 一切都很好 但是当我尝试在视图中显示它们时 我得到了属性在此集合上不存在的错误 这是关系代码 public fun
  • 作为数据流写入 div

    考虑写入 div 的 AJAX 调用 recent req post result php d data function returnData content html returnData PHP 脚本位于result php执行一些需
  • 如何使用 PHP 调整缩略图大小时提高图像质量?

    我在网上找到了这个脚本 它可以从图像中创建缩略图 但创建的缩略图质量很差 如何提高图像的质量 有没有更好的方法来创建缩略图 如果有的话 您能给我指点一下如何使用 PHP 创建缩略图的教程吗 这是下面的代码
  • 如何捕获 Symfony2/Silex 中的错误和异常?

    我想在我的 Silex 应用程序中捕获错误和异常 将它们包装在始终返回给客户端的自定义 JSON 响应中 我发现了三种基本方法 app gt error Symfony Component Debug ErrorHandler regist
  • 在 Laravel 5.4 中选择下拉列表的选定值

    我有一个名为 名称 的下拉列表 用户将在其中选择其中一个 提交后 如果出现一些错误 那么我想选择所选的名称 我在 laravel 5 4 中使用它 控制器 info DB table designation gt where status
  • dompdf 在文档末尾插入空白页

    我正在使用 dompdf 0 6 0 生成 pdf 文档 并且遇到一个奇怪的问题 即最后创建了一个空白页面 我的 简化的 html
  • 根据相同的 XML 模式 (XSD) 加速一批 XML 文件的 XML 模式验证

    我想加快根据同一个 XML 模式 XSD 验证一批 XML 文件的过程 唯一的限制是我处于 PHP 环境中 我当前的问题是 我想要验证的模式包括 2755 行的相当复杂的 xhtml 模式 http www w3 org 2002 08 x
  • PHP 中比较运算符“==”的混淆

    In PHP null 0 0 0 如果将这两者结合起来 您会期望 null 0 但是这是错误的 有人可以向我解释一下吗 在第一种情况下 null 0 null评估为false 与 一样0其评估结果为false 所以两者都是false所以比
  • PHP 中的 GOTO 命令?

    我听说 PHP 计划引入 goto 命令的传言 它应该做什么 我尝试搜索了一下 但没有找到任何具有描述性的内容 我明白这不会是 GOTO 10 类似命令 They are not adding a real GOTO but extendi
  • 使用 PKCS1 生成私钥 RSA

    有没有办法在 PHP 中通过 OpenSSL 生成私钥openssl pkey 新 http php net manual en function openssl pkey new php在 RSA 和 PKCS1 中 如果您的意思是带有
  • Doctrine 生成实体命名空间问题?

    好吧 我对原则有最后一个问题 生成 实体命令 我运行以下命令 并得到预期的文件 src MyNamespace Bundle MyNamespaceBundle Resources config doctrine metadata orm
  • 在 Woocommerce 商店页面中显示可变产品的默认变化价格

    I m wondering how I can display the product price on the shop page Right now my variable products are shown with their p

随机推荐

  • 如何在 Python 中检查 MySQL 连接是否打开?

    我正在使用 MySQLdb http mysql python sourceforge net 看来connection open 和connection sqlstate 对我不起作用 下面是代码 def open self TODO c
  • 将字符串格式的科学记数法转换为spark数据帧中的数字[重复]

    这个问题在这里已经有答案了 Day Date timeofday desc Timeofday hour Timeofday minute Timeofday second value 2017 12 18 12 21 02 AM 0 21
  • 如何在 Bash 中将换行符打印为 \n ?

    基本上 我想实现类似的逆echo e 我有一个存储命令输出的变量 但我想将换行符打印为 n 这是我的解决方案 sed s n tr d n
  • R 包 Kohonen - 如何绘制六边形而不是像 Matlab SOM 工具箱中的圆形?

    是否可以用六边形绘制 SOM 图 Kohonen 包 作为基本形式而不是圆形 现在不同的情节 计数 变化等 绘制为周围白色的圆圈 目的是创建类似于 Matlab SOM Toolbox 的 SOM 视觉效果 This 讨论表明六边形绘图在
  • Java 中的“运行时类”是什么?

    我试图理解什么是Object getClass 方法确实如此 The 文档说它 返回对象的运行时类 该解释无助于我理解该术语 有人简单描述一下什么是 运行时类 以及什么getClass does 只需将其理解为 具有该对象类型的所有元数据的
  • 在Java中创建给定大小的文件

    有没有一个高效的在Java中创建给定大小的文件的方法 在C中可以用以下方法完成截断 see 那个答案 大多数人只会写n将虚拟字节放入文件中 但必须有更快的方法 我在想截断还有的稀疏文件 创建一个新的随机访问文件并调用 setLength 方
  • 如何创建从 HTTP/HTTPS API 获取数据的 Alexa Skill(在 AWS Lambda 上使用适用于 Node.js 的“Alexa Skills Kit”)

    我想为 Amazon Alexa 创建一项技能 当由语音命令触发时 它可以通过 HTTPS 请求从 API 获取一些信息 并将结果用作对 Alexa 用户的口头回答 由于 Node js 的事件驱动概念以及 Node js 的内部结构 这里
  • System.TypeLoadException:方法“get_xxx”没有实现

    关于这个问题有很多问题 我已经毫无乐趣地解决了它们 我收到此错误 程序集中类型 App Web WebConfig 中的方法 get UserImageCDNUrl App Web 版本 1 0 0 0 文化 中性 PublicKeyTok
  • SwiftUI 不更新第二个 NavigationLink 目的地

    我有一个列表 其中包含推送视图的行 该视图有另一个列表 它推动另一个视图 原始List和最先推送的List会在数据发生变化时更新 但是 最后一个视图在推送时不会更新 当我向后滑动时 视图不再更新 尽管它曾经更新过 主页视图 gt 用户视图
  • 数据绑定 WPF 中 WebBrowser 的 Source 属性

    有谁知道如何在 WPF 3 5SP1 中对 WebBrowser 的 Source 属性进行数据绑定 我有一个列表视图 我希望左侧有一个小型 Web 浏览器 右侧有内容 并将每个 Web 浏览器的源与绑定到列表项的每个对象中的 URI 进行
  • 无法将 Nexus One 手机连接到 Android adb

    我正在运行 Android SDK 2 2 并尝试让 adb 连接到 Google Nexus One 手机 这是一部新手机 直接从 Google 发货 尚未安装任何应用程序 我有Windows XP 这是我到目前为止所做的 按照 Andr
  • 如何强制在 iOS Safari 中打开链接?

    我的网页有下载 Passbook pkpass 文件的链接 这在 iOS 版 Safari 中运行良好 因为 Apple 浏览器支持 mime 类型 application com vnd apple pkpass Facebook 的 i
  • 数据表 - 将列合并在一起

    我有这些数据库列 但我希望它们位于一列中 我该怎么做呢 我想用 mRender 吧 Address sTitle Address bVisible true bSearchable true City sTitle City bVisibl
  • 如何在 Mac OS X 上安装 MySQL gem

    在 Mac OS X 上安装 mysql gem 需要什么 我收到错误 无法构建本机扩展 首先安装 MySQL 可以使用二进制文件 也可以Homebrew Then gem install mysql2 Or gem install rub
  • HEAD~4^2 含义

    在涉及相对提交引用的 Udacity 课程中 它说 表示父提交 表示第一个父提交 和 之间的主要区别在于提交的时间 由合并创建 合并提交有两个父项 通过合并 commit 时 引用用于指示该文件的第一个父级 提交 而 2 表示第二个父级 第
  • 在 Windows 上设置 Python simpleHTTPserver [重复]

    这个问题在这里已经有答案了 我想设置PythonSimpleHTTPServer在 Windows XP 上 我的电脑上安装了Python 我正在执行以下命令 python m SimpleHTTPServer 8888 但我收到错误 C
  • 使用 .join 函数连接实现 __str__ 方法的非字符串 python 对象列表[重复]

    这个问题在这里已经有答案了 我已经看过了这个关于在Python中表示字符串的问题但我的问题略有不同 这也与问题不同如何将列表中的项目连接 连接 为单个字符串它是在这个问题之后创建的 适用于字符串列表 因此对这个问题没有任何适用性 这个问题的
  • TextView锚链接空间

    我想制作一个带有链接的 TextView 我用html和java的结合做到了 used to enable link navigation on TextView setMovementMethod LinkMovementMethod g
  • 如何在 MATLAB 中使用 2-D 掩码索引 3-D 矩阵?

    假设我有 D 一个 X Y Z 数据矩阵 我还有 M 一个 X Y 掩蔽 矩阵 我的目标是当 M 中的 Xi Yi 为 false 时 将 D 中的元素 Xi Yi 设置为 NaN 有什么办法可以避免在循环中这样做吗 我尝试使用ind2su
  • “zend_mm_heap 损坏”是什么意思

    突然之间 我的应用程序出现了以前从未遇到过的问题 我决定检查 Apache 的错误日志 发现一条错误消息 zend mm heap 损坏 这是什么意思 操作系统 Fedora Core 8 阿帕奇 2 2 9 PHP 5 2 6 这不是一个