【问题标题】:What are the symptoms of a stack overflow in a C++ program?C++ 程序中堆栈溢出的症状是什么?
【发布时间】:2009-02-18 21:45:40
【问题描述】:

我刚遇到一个问题,当本地对象试图调用一个非常简单的过程时,HPUX 上的线程 c++ 程序中的堆栈溢出导致 SEGV_MAPERR。我有一段时间感到困惑,但幸运的是,我与一个认识到这是堆栈大小问题的人交谈,我们能够通过增加线程可用的堆栈大小来解决这个问题。

如何识别堆栈何时溢出? windows/linux/hpux 上的症状是否不同?

【问题讨论】:

  • 这很有趣...... stackoverflow 标签是合适的,除非没有人将它用于实际的堆栈溢出。
  • 是的,我想知道谁是放置stackoverflow标签的小丑。 :-)
  • 在本站很难搜索到实际的堆栈溢出信息...

标签: c++ stack-overflow


【解决方案1】:

假设您不在一个会停止您的应用并说“堆栈溢出”的平台上,我怀疑您会看到与任何类型的缓冲区溢出相同的行为。堆栈只是为您的程序预先分配的另一块内存,如果您超出这些范围...祝您好运!谁知道你会踩到什么!

您可以改写来自 CPU 的温度读数,可能是您正在给 Larry 输入的电子邮件,也可能是说内核已锁定,从而导致有趣的死锁情况!谁知道呢。

至于 C++,没有说堆栈应该如何相对于内存中的其他东西布局,或者这个东西甚至需要是一个堆栈!

【讨论】:

    【解决方案2】:

    如何识别堆栈何时溢出?

    如果您知道堆栈大小、堆栈开始的位置以及它在内存中的增长方向,您可以简单地检查stack pointer 的地址,看看它是否超过了堆栈的末尾。 C++ 不允许直接访问堆栈指针。您可以轻松地在汇编中编写一个小函数来执行此分析并将其链接到您的程序中。

    【讨论】:

    • 检查堆栈指针似乎有助于判断有问题的错误是堆栈溢出还是不同类型的内存损坏。谢谢!
    【解决方案3】:

    Windows 上的异常代码 0xC00000FD

    当您意识到您的 SEH 停止工作时,通常更容易诊断。

    【讨论】:

      【解决方案4】:

      也许有点跑题了,但 Ada 中的类似问题(任务中的堆栈空间不足)是一个相当常见的“不常见”错误。许多编译器会以 PROGRAM_ERROR 异常停止任务(但不是主任务)。

      在某种程度上,您几乎必须能够嗅出这个。它的开头往往是“我将这个大数组移动到我的任务中,然后它突然停止工作”。

      【讨论】:

        【解决方案5】:

        屏幕上的输出文本与被测程序的代码行混合在一起。还存在以前的 bash 命令和其他来源不明的文本。再加上程序文本已损坏。

        【讨论】:

          猜你喜欢
          • 2010-11-09
          • 1970-01-01
          • 2010-09-11
          • 2013-12-12
          • 2010-11-05
          • 2012-05-10
          • 1970-01-01
          • 2010-12-11
          • 2014-12-28
          相关资源
          最近更新 更多