我刚遇到一个问题,当一个本地对象试图调用一个非常简单的过程时,HPUX上的线程c ++程序中的堆栈溢出导致SEGV_MAPERR。我有一段时间感到困惑,但幸运的是我和那些认识到这是堆栈大小问题的人交谈过,我们能够通过增加线程可用的堆栈大小来解决问题。
如何识别堆栈何时溢出?在windows / linux / hpux上症状有所不同吗?
答案 0 :(得分:10)
假设你不在一个会停止你的应用并说“堆栈溢出”的平台上,我怀疑你会看到你从任何缓冲区溢出中看到的相同行为。堆栈只是你程序的另一个预先分配的内存块,如果你超出这些界限......祝你好运!谁知道你会踩到什么!
你可以写一下来自CPU的温度读数,它可能是你给Larry输入的电子邮件,可能有点说内核被锁定,导致一个有趣的死锁条件!谁知道呢。
至于C ++,没有什么可以说堆栈应该如何与内存中的其他内容相关联,或者这个东西甚至需要成为堆栈!
答案 1 :(得分:2)
如何识别堆栈何时溢出?
如果您知道堆栈大小,堆栈启动的位置以及它在内存中的增长方向,您只需检查stack pointer的地址并查看它是否超过堆栈的末尾。 C ++不允许直接访问堆栈指针。您可以轻松地在汇编中编写一个小函数来执行此分析并将其链接到您的程序中。
答案 2 :(得分:0)
Windows上的异常代码0xC00000FD
。
通常,当您意识到SEH停止工作时,诊断会更容易。
答案 3 :(得分:0)
也许有点偏离主题,但Ada中的类似问题(任务中的堆栈空间不足)是一个相当常见的“罕见”错误。许多编译器将使用PROGRAM_ERROR异常停止任务(但不是主要任务)。
在某种程度上,你几乎必须能够嗅出这个。它倾向于从诸如“我在我的任务中移动这个大数组,然后它突然停止工作”之类的东西开始。
答案 4 :(得分:-1)
输出到屏幕的文本与来自被测程序的代码行混合在一起。还出现了以前的bash命令和其他未知来源的文本。添加到所有程序文本已损坏。