【问题标题】:C++ Heap CorruptionC++ 堆损坏
【发布时间】:2011-08-03 21:35:04
【问题描述】:

我有一段时间没有做过任何 C++,但我决定完成一个我正在为某人工作的大项目。我现在收到以下错误消息...

检测到堆损坏:在 0x17DEB940 的正常块 (#1761) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。

我一直在逐步检查我认为可能导致它的所有功能,但我不知所措。有什么方法可以使用更高级的调试功能来解决这个问题?

【问题讨论】:

  • 谢谢。呵呵,Linux、Mac 和不可知论者的答案最先发布的可能性有多大。
  • 你是在使用智能指针和 C++ 容器模板类,还是这更像是一个 C with Classes 程序?

标签: c++ debugging visual-c++ corruption heap-memory


【解决方案1】:

听起来确实像是典型的内存损坏错误。该平台将是有用的信息。在没有看到您的代码及其复杂性的情况下,有几种可能性:

  1. 我会猜测运行时 库将允许您添加调用 堆验证代码直接来自 你的代码。我建议放置 调用堆验证代码 你的代码中的各个地方,所以你 可以弄清楚事情的去向 错误的。你会找到那个地方 堆坏了,你会知道的 上次通话没问题。 继续缩小该窗口,如果 您需要然后查看代码 问题发生在哪里。

  2. 如果相同的步骤损坏了内存中完全相同的位置, 你应该可以使用你的 调试器设置断点(或观察点) 内存变了。一些 这些更改可能是有意的,但 你应该能够弄清楚 谁是罪魁祸首。

如果您的代码特别复杂或重现此代码所需的步骤很长,您可以将两者结合使用 - 缩小有问题的代码部分,然后在损坏的内存位置放置断点。

大卫

【讨论】:

    【解决方案2】:

    在 Linux 上,我会推荐 valgrind 作为一个工具,它可以准确地告诉你出了什么问题。您可以查看一些 Windows 替代方案 here

    【讨论】:

    • 我在 Windows 上成功使用了 Purify,但它是 $$$。
    【解决方案3】:

    尝试用乐器捕捉它。

    听起来有点像经典的 C 错误。您确定不会在 while 或 for 循环中写入超出 c 数组(如 int[xyz])的内容吗?它不会导致任何错误,但是您会在很多与错误所在的部分无关的空间中得到奇怪的效果。 :p

    【讨论】:

      【解决方案4】:

      尝试在启用正常页堆的情况下使用 AppVerifier。如果您随后将调试器附加到该进程并且幸运地发生堆损坏,它将在内存块被损坏的地方中断(由于块写入溢出或欠载)。稍加努力,您还可以获得分配每个堆块的代码的调用堆栈,这也有助于追踪错误。

      跟踪这些错误可能很棘手,有关详细信息,请查看高级 Windows 调试一书,该书有一整章专门介绍该主题。

      【讨论】:

        猜你喜欢
        • 2011-12-03
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 2018-03-26
        • 2010-10-17
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        相关资源
        最近更新 更多