gpt4 book ai didi

c - 如何为我的 php 扩展调试 'zend_mm_heap corrupted'

转载 作者:行者123 更新时间:2023-11-30 17:32:10 25 4
gpt4 key购买 nike

问题

我编写了一个 php 扩展(PHP 5.3),它对于简单测试来说似乎工作得很好,但是当我开始进行多次调用时,我开始看到错误:

zend_mm_heap corrupted

通常通过控制台或apache错误日志,我有时也会看到错误

[Thu Jun 19 16:12:31.934289 2014] [:error] [pid 560] [client 127.0.0.1:35410] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 139678164955264 bytes) in Unknown on line 0

我尝试过的事情

我尝试找到问题发生的确切位置,但它似乎发生在为调用扩展的 php 类调用的析构函数之间,但在构造函数运行构造函数的第一行之前(注意,我主要使用 phpunit 来诊断此问题,如果我在浏览器中运行它,它通常会工作一次,然后在下次尝试时将错误抛出到日志中,并在浏览器窗口中显示“连接已重置”,因此没有输出。

我尝试使用 memory_get_usage 添加调试行并安装扩展 memprof,但所有输出均未显示任何严重的内存问题,而且我从未见过内存使用量超过 8mb。

我查看了其他堆栈溢出帖子,涉及更改 php 设置以处理 zend_mm_corrupted 问题、禁用/启用垃圾收集,但没有取得任何成功。

我在寻找什么

我意识到这里没有足够的信息来可能知道是什么导致了我认为的内存泄漏,所以我想知道的是我的问题的可能原因是什么以及我该如何诊断这个问题要找出问题出在哪里。

注意:

我尝试使用 --enable-debug 构建我的扩展,但它作为无法识别的参数出现。

编辑:Valgrind

我用 valgrind 运行它并得到以下输出:

--24803-- REDIR: 0x4ebde30 (__GI_strncmp) redirected to 0x4c2dd20 (__GI_strncmp)
--24803-- REDIR: 0x4ec1820 (__GI_stpcpy) redirected to 0x4c2f860 (__GI_stpcpy)
Segmentation fault (core dumped)
==24803==
==24803== HEAP SUMMARY:
==24803== in use at exit: 2,401 bytes in 72 blocks
==24803== total heap usage: 73 allocs, 1 frees, 2,417 bytes allocated
==24803==
==24803== Searching for pointers to 72 not-freed blocks
==24803== Checked 92,624 bytes
==24803==
==24803== LEAK SUMMARY:
==24803== definitely lost: 0 bytes in 0 blocks
==24803== indirectly lost: 0 bytes in 0 blocks
==24803== possibly lost: 0 bytes in 0 blocks
==24803== still reachable: 2,401 bytes in 72 blocks
==24803== suppressed: 0 bytes in 0 blocks
==24803== Reachable blocks (those to which a pointer was found) are not shown.
==24803== To see them, rerun with: --leak-check=full --show-reachable=yes
==24803==
==24803== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
--24803--
--24803-- used_suppression: 2 dl-hack3-cond-1
==24803==
==24803== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

这向我表明问题可能不是内存泄漏,但我对此不确定。

最佳答案

在我看来,您的程序确实存在堆内存损坏。通过查看代码片段或错误的调用堆栈来找到这一点有点困难。您可能希望在一些动态工具(Valgrind、WindDBG/Pageheap)下运行您的程序来跟踪错误的实际来源。

$ valgrind --tool=memcheck --db-attach=yes ./a.out

这样,当检测到第一个内存错误时,Valgrind 会将您的程序附加到调试器中,以便您可以进行实时调试(GDB)。这应该是理解和解决您的问题的最佳方式。

Allowed memory size of 134217728 bytes exhausted (tried to allocate 139678164955264 bytes) in Unknown on line 0

看起来程序中的某个地方正在执行有符号到无符号的转换。通常分配器具有无符号类型的大小参数,因此它将负值解释为非常大的类型,在这种情况下,分配将失败。

关于c - 如何为我的 php 扩展调试 'zend_mm_heap corrupted',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24319017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com