0

一般背景:

我正在尝试分析发生堆损坏的转储。堆损坏发生在 std::vector.push_back - 当超过向量容量并且需要更多空间时,对旧向量的“空闲”调用失败。

分析细节:

通过对转储的分析,我看到“释放”的指针位于现有“HEAP_ENTRY”块的中间。我通过使用“!heap -h”枚举相关堆的所有块并发现空闲块位于两个现有块之间来看到这一点(它们之间的差异很大,当然不仅仅是8-16字节元数据或类似的东西)。

问题:

  1. 以前的堆损坏是否会导致堆管理器将地址返回到块的中间,从而在我尝试释放它时必然会导致崩溃?
  2. 如果 1. 为真,则意味着在这里使用 pageheap 不是很有用,因为损坏似乎发生在始终可写的数据上,所以我认为 pageheap(gflags 选项)无法检测到这一点。你有什么建议我可以抓住这种腐败发生的点吗?

非常感谢,阿米特

4

2 回答 2

1

您可能最好使用工具来找到问题所在的更好线索。

  • Valgrind 相当不错。

  • 一些操作系统内置了 malloc() 诊断,可以通过环境变量即时启用,无需额外的努力。查看系统上 malloc() 的手册页。

于 2013-09-02T06:18:16.550 回答
0

我猜它是一个过时的指针,听起来它可能在过去被有效分配 - 但可能在过去也被释放,然后被更大的块分配。

在那种情况下,问题是双重释放。如果您的代码是多线程的,则可能是导致过时指针的线程安全问题。

于 2013-09-01T22:56:11.470 回答