一般背景:
我正在尝试分析发生堆损坏的转储。堆损坏发生在 std::vector.push_back - 当超过向量容量并且需要更多空间时,对旧向量的“空闲”调用失败。
分析细节:
通过对转储的分析,我看到“释放”的指针位于现有“HEAP_ENTRY”块的中间。我通过使用“!heap -h”枚举相关堆的所有块并发现空闲块位于两个现有块之间来看到这一点(它们之间的差异很大,当然不仅仅是8-16字节元数据或类似的东西)。
问题:
- 以前的堆损坏是否会导致堆管理器将地址返回到块的中间,从而在我尝试释放它时必然会导致崩溃?
- 如果 1. 为真,则意味着在这里使用 pageheap 不是很有用,因为损坏似乎发生在始终可写的数据上,所以我认为 pageheap(gflags 选项)无法检测到这一点。你有什么建议我可以抓住这种腐败发生的点吗?
非常感谢,阿米特