6

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

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

4

5 回答 5

10

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

你可以重写 CPU 的温度读数,它可能是你正在给拉里输入的电子邮件,也可能是说内核被锁定,导致一个有趣的死锁状态!谁知道。

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

于 2009-02-18T21:48:57.973 回答
2

如何识别堆栈何时溢出?

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

于 2009-02-18T23:42:14.397 回答
1

Windows 上的异常代码0xC00000FD

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

于 2009-02-18T21:57:21.073 回答
0

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

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

于 2009-02-18T22:00:11.833 回答
-1

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

于 2016-10-24T18:35:47.313 回答