C ++堆腐败

时间:2011-04-12 13:21:21

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

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

HEAP CORRUPTION DETECTED:正常阻止(#1761)后的0x17DEB940。 CRT检测到应用程序在堆缓冲区结束后写入内存。

我一直在踩过我认为可能导致它的所有功能,但我不知所措。有没有办法使用更高级的调试功能来追捕它?

4 个答案:

答案 0 :(得分:4)

听起来像是经典的内存损坏错误。该平台将是有用的信息。没有看到你的代码和它的复杂性,有几种可能性:

  1. 我会猜测运行时 库允许你添加调用 堆验证代码直接来自 你的代码。我建议放置 调用堆验证代码 代码中的各个地方让你 可以弄清楚事情的进展 错误。你会找到的地方 堆坏了,你会知道的 在之前的电话会议上没问题。 如果,请继续缩小该窗口 你需要然后检查代码 发生问题的地方。

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

  3. 如果您的代码特别复杂或者重现这些代码所需的步骤很长,您可以使用这两者的组合 - 缩小代码段,使其有问题,然后在内存位置上放置一个断点。< / p>

    大卫

答案 1 :(得分:2)

在Linux上,我建议使用valgrind作为一种能够准确告诉您出错的工具。您可以查看一些Windows替代方案here

答案 2 :(得分:1)

尝试用Intruments抓住它。

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

答案 3 :(得分:1)

尝试使用启用了正常pageheap的AppVerifier。如果你随后将一个调试器附加到进程并且运行时出现堆损坏,它将在内存块被破坏的地方中断(通过块写入溢出或欠载)。只需稍加努力,您还可以获得分配每个堆块的代码的callstack,这也可以帮助追踪错误。

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