首页 > 解决方案 > 可以切换虚拟机修复 *** 检测到堆栈粉碎 ***

问题描述

我一直在为我的操作系统类工作的调度程序在我正在使用的虚拟机上收到“***堆栈粉碎检测到***”错误(我正在使用带有 virtualbox 的 Vagrant)。这个错误发生在我运行程序的大约 50% 的时间里。当切换到我们教授提供的VM集群时(在上述VM上使用SSH连接),错误从未出现过。

我的第一直觉是我的本地虚拟机没有分配足够的内存,而且我正在运行的代码不知何故超出了我的虚拟机可以访问的范围。(测试涉及在自己的线程中执行 128 个不同大小的矩阵乘法)

谁能确认这是否是一个可行的解释?我担心错误只是在另一个VM上被忽略(我对使用标志-g和-lm编译的两者都使用相同的makefile)。谢谢!

标签: operating-systemvirtual-machinestack-smash

解决方案


当您的程序覆盖其局部变量所在区域上方的“金丝雀”内存时,会导致检测到堆栈粉碎。这通常是由于写入的本地数组元素多于为其分配的元素。没有错误的程序不应该任何机器上执行此操作,无论可用内存有多少或有多少。所以你的程序有问题,需要修复。

特别是,这个错误不是简单地用完堆栈空间引起的。

很可能其他 VM 将其编译器配置为默认禁用此检查。您可以使用 重新启用它-fstack-protector。但无论哪种方式,您都应该在任何一台允许您重现它的机器上调查并修复此错误。


推荐阅读