这个问题可能没有适合所有情况的具体答案,但我们可以尊重一些一般原则吗? 在自己的模块中发生覆盖可能有点容易,但如果覆盖是由其他人编写的另一个模块引起的,并且程序随机崩溃,我们该怎么办呢?
答案 0 :(得分:1)
我有一个名为Purify的产品很幸运,它在编译时包含它后执行内存边界检查。我链接到的维基百科页面也列出了一些开源替代品。
答案 1 :(得分:1)
内存覆盖通常是由悬空指针引起的。虽然这不是唯一的情况,但它很常见,因此我发现了一种非常有用的技术:
通过实现自己的内存分配器,您可以打开一个特殊的调试模式,在此模式下将已知模式写入释放的内存。然后,您定期检查所有可用内存,以查看该模式是否已被覆盖。如果你有断言或记录或什么。这通常会找到写一些悬垂指针的罪魁祸首。
此外,您可以使用自定义分配器记录按地址分配的内容。因此,如果您发现有人覆盖了地址0x30203,您只需检查该内存的分配对象。
我意识到这听起来像是一个特例,但它在很多情况下帮助了我