堆栈内存错误创建核心文件
Stack memory error create a core file?
我从来没有见过这个,但我脑子里有这个东西!
这里的堆栈内存错误也可能是内存损坏。假设c/c++程序中存在堆栈溢出。
它会创建一个核心转储文件吗?
它取决于操作系统和语言运行时。我假设你说的是Unix/Linux的某种风格,因为你提到了核心转储。
通常,堆栈之外会有一定数量(可能是一页)的未映射虚拟内存。如果溢出量小于该值,则程序将尝试访问该值,从而产生分段错误。如果程序没有处理信号,那么它将中止;如果启用了核心转储,那么就会产生一个。您可能需要启用核心转储,可能需要从用于启动程序的shell中使用ulimit -c unlimited
。
如果您的溢出量很大,那么您可能会覆盖程序内存的其他部分。如果发生这种情况,那么所有的赌注都会落空;该程序可能崩溃,或者可能继续处于腐败状态,并在未来的任何时候造成任何形式的损害。
这是假设,"溢出"意味着使用的堆栈内存比深度调用堆栈和大型自动对象的组合所分配的内存多。如果你谈论的是写入堆栈的错误部分(例如,通过对自动数组的越界访问),那么你通常会得到随机内存损坏,而不是分段错误;同样,该程序可能会在一个不可预测的结果的腐败状态下蹒跚前行。
堆栈溢出不会始终创建核心转储文件。如果幸运的话,这只是堆栈的简单溢出,一些局部变量或缓冲区被覆盖。它可能不会导致程序出现任何异常行为,也不会导致核心转储文件。
但是,如果堆栈溢出覆盖了一些作为指针或返回地址的局部变量,当您使用指针(现在是无效地址并指向未映射的内存页),或者程序使用指针写入只读页时,会导致分段错误,并创建核心转储文件。或者返回地址被覆盖,CPU返回到无效寻址空间或执行无效代码,这也会导致异常并创建核心文件。
- C++代码生成核心文件,就像 gdb >> gcore 一样
- Linux:有没有办法找出生成核心文件的过程
- 在远程嵌入式设备上使用核心文件的 GDB - 如何获取有关回溯的更多信息?
- 为什么我的 Redhat 服务器上的 QuickFIX 进程没有将其核心文件写入应有的位置?
- 如何计算预期的核心文件大小
- 堆栈内存错误创建核心文件
- 我如何利用核心文件在C/C 中找到应用程序问题
- 将大型核心文件转换为"minicore"文件
- 没有在gdb中加载带有breakpad核心文件的符号
- 如何避免编写核心文件并加快回溯生成
- 教 gdb 理解核心文件中的微线程
- GDB 核心文件丢失
- 如何多次更改核心文件大小限制
- 是否可以从 ELF 核心文件中删除堆
- 正在查找使用核心文件消耗的内存
- 可以将核心文件恢复到正在运行的程序中
- ulimit对核心文件大小不起作用?
- gdb 7.0警告:核心文件中的fpregset大小错误
- 如何使用 gdb 从核心文件中获取 lua 堆栈跟踪
- 从核心文件中获得完全意外的错误