我从来没有见过这个,但我脑子里有这个东西!
这里的堆栈内存错误也可能是内存损坏。假设 ac/c++ 程序中存在堆栈溢出。
它会创建核心转储文件吗?
堆栈溢出不会始终创建核心转储文件。如果幸运的话,这只是堆栈的简单溢出,一些局部变量或缓冲区被覆盖。它可能不会导致程序的任何异常行为,也不会导致核心转储文件。
但是,如果堆栈溢出覆盖了一些局部变量,即指针或返回地址,当您使用指针时,该指针现在是无效地址并指向未映射的内存页面,或者程序使用指针写入只读页面,它会导致分段错误并创建核心转储文件。或者返回地址被覆盖,CPU返回到无效的寻址空间或执行无效的代码,也会引起异常并创建core文件。
这取决于操作系统和语言运行时。我假设您在谈论某种 Unix/Linux 风格,因为您提到了核心转储。
通常,堆栈之外会有一些(可能是单页)未映射的虚拟内存。如果溢出少于该数量,则程序将尝试访问该数量,从而产生分段错误。如果程序不处理信号,那么它将中止;如果启用了核心转储,则会生成一个。您可能需要启用核心转储,可能是ulimit -c unlimited
从您用来启动程序的 shell 中使用。
如果您溢出大量,那么您可能会覆盖程序内存的其他部分。如果发生这种情况,那么所有的赌注都会被取消;该程序可能会崩溃,或者可能会继续处于损坏状态并在未来的任何时候造成任何类型的损害。
这是假设,通过“溢出”,您的意思是使用比深度调用堆栈和大型自动对象的某种组合分配的更多的堆栈内存。如果您正在谈论写入堆栈的错误部分(例如,通过对自动数组的越界访问),那么您通常会得到随机内存损坏而不是分段错误;再一次,程序可能会在一个损坏的状态下蹒跚而行,结果是不可预测的。