【问题标题】:how to increase Stack Size of a running program in C如何在 C 中增加正在运行的程序的堆栈大小
【发布时间】:2015-08-14 02:49:26
【问题描述】:

我正在尝试确定是否可以在获得 SIGSEGV 后增加正在运行的程序的堆栈大小。我知道我们可以通过 ulimit -c 增加堆栈的大小,但是,这并没有解决这个问题。因为我的进程已经死了。我想处理这种情况,即使在段错误之后我的进程也不会被杀死。 setrlimit() 是一种可用于静态超出堆栈大小的方法。但我不想阻塞比我需要的更多的内存。

【问题讨论】:

  • 我需要注意程序在运行时是否出现堆栈溢出。程序应该能够处理它并在运行时动态增加堆栈的大小。

标签: c linux operating-system posix


【解决方案1】:

在 Linux 下,为堆栈大小设置更高的限制不会将此内存提交给您的进程。内存将根据需要被调入。

默认堆栈大小已经相当大了。您应该在调试器下运行或在 SIGSEGV 上生成内核以分析实际情况。您可能有非常深的递归,或过多的局部变量空间,可能是通过错误分配的 VLA。增加堆栈空间可能会暂时隐藏问题,但这不是一个可靠的解决方案。

【讨论】:

  • 我不能再同意了。我确定代码中存在一些“错误”,请给我看代码。
  • 我的意思是我非常同意你的看法。对不起我糟糕的英语。 :)
【解决方案2】:

最近的操作系统不会自动为堆栈保留内存,而只是根据需要添加页面。 ulimit 只是您允许它用完的上限。因此,静态增加堆栈大小应该没有问题,并且正是您想要的。

【讨论】:

  • 我需要注意程序在运行时是否出现堆栈溢出。程序应该能够处理它并在运行时动态增加堆栈的大小。
  • 好的。因此,无论如何您都必须编辑该程序。抱歉,帮不上忙。问题是段错误会破坏堆栈帧,因此不可能进行静默恢复。我实际上不确定这是否可能,因为这可能会破坏安全性。我能想到的唯一选择是在每次创建堆栈帧时调用一个看门狗(分析存根可能在这里有所帮助)并检查内部阈值。但这将是一个性能杀手。你最好重新考虑为什么/如果你真的需要那么多堆栈空间。也许你会和 malloc() 相处得更好
  • 只是为了清楚地说明(再次):堆栈是动态增加的。这是由 Linux 内核完成的。没有预先分配内存,但仅在需要时分配。如果您的程序想知道何时提交页面,那么您的程序很可能充其量只是 hacky(调试/分析工具除外)。
猜你喜欢
  • 2017-09-05
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 2021-04-02
  • 2012-04-18
  • 2021-03-17
  • 2011-06-30
  • 2016-07-15
相关资源
最近更新 更多