堆栈内存错误创建核心文件

Stack memory error create a core file?

本文关键字:核心 文件 创建 错误 内存 堆栈      更新时间:2023-10-16

我从来没有见过这个,但我脑子里有这个东西!

这里的堆栈内存错误也可能是内存损坏。假设c/c++程序中存在堆栈溢出。

它会创建一个核心转储文件吗?

它取决于操作系统和语言运行时。我假设你说的是Unix/Linux的某种风格,因为你提到了核心转储。

通常,堆栈之外会有一定数量(可能是一页)的未映射虚拟内存。如果溢出量小于该值,则程序将尝试访问该值,从而产生分段错误。如果程序没有处理信号,那么它将中止;如果启用了核心转储,那么就会产生一个。您可能需要启用核心转储,可能需要从用于启动程序的shell中使用ulimit -c unlimited

如果您的溢出量很大,那么您可能会覆盖程序内存的其他部分。如果发生这种情况,那么所有的赌注都会落空;该程序可能崩溃,或者可能继续处于腐败状态,并在未来的任何时候造成任何形式的损害。

这是假设,"溢出"意味着使用的堆栈内存比深度调用堆栈和大型自动对象的组合所分配的内存多。如果你谈论的是写入堆栈的错误部分(例如,通过对自动数组的越界访问),那么你通常会得到随机内存损坏,而不是分段错误;同样,该程序可能会在一个不可预测的结果的腐败状态下蹒跚前行。

堆栈溢出不会始终创建核心转储文件。如果幸运的话,这只是堆栈的简单溢出,一些局部变量或缓冲区被覆盖。它可能不会导致程序出现任何异常行为,也不会导致核心转储文件。

但是,如果堆栈溢出覆盖了一些作为指针或返回地址的局部变量,当您使用指针(现在是无效地址并指向未映射的内存页),或者程序使用指针写入只读页时,会导致分段错误,并创建核心转储文件。或者返回地址被覆盖,CPU返回到无效寻址空间或执行无效代码,这也会导致异常并创建核心文件。