【问题标题】:Stack overflow exception handling xe166堆栈溢出异常处理 xe166
【发布时间】:2011-05-24 12:36:04
【问题描述】:

如果发生堆栈溢出陷阱,我希望控制器:

  • 发送消息通知用户发生堆栈溢出
  • 发送消息后进行重置

我想知道在开始此异常处理之前重置堆栈指针是否是个好主意,以确保该过程将在不弄乱内存的情况下完成,还是有更好的方法来处理此异常?

【问题讨论】:

  • 这么少的细节,你的问题是无法回答的。你在运行操作系统吗?您通过哪些渠道发送消息?您的内存布局是什么:异常处理程序从哪里获取堆栈空间?
  • 没有操作系统在运行,通道还没有定义。我们的想法是找到一个基本的解决方案,使其尽可能简单。

标签: c stack overflow


【解决方案1】:

堆栈溢出异常并不意味着任何错误仍然,就我在编写早期 C167(我认为 xe166 的来源)的日子里所记得的那样。这只是意味着你就在堆栈的末尾。事实上,只要有足够的技巧,您就可以使用堆栈溢出和堆栈下溢异常来“分页”进出主内存的更大堆栈!

因此,如果您可以确保异常处理程序不需要进一步的堆栈,那么您可以在不重置 SP 的情况下逃脱。尽管我想你可能会从中调用一些函数,在这种情况下,有一些可用的堆栈空间可能会很有用:)

您关于“混乱的堆栈”的评论并不是问题 - 一旦堆栈指针到达末尾,任何进一步的堆栈使用都会弄乱其他事情,这可能是您的异常代码正在执行的数据依靠。听起来你必须保证会发生重置,但如果你开始用错误的 SP 破坏内存,你无法预测会发生什么。

因此,如果它是一个远程关键系统,请找到一种方法来为“紧急堆栈”提供内存,然后在继续处理异常处理程序之前将 SP 指向该内存。

【讨论】:

  • 我希望堆栈溢出不会经常发生所以我希望找到一个不意味着太多工作的解决方案:)
  • 我认为重置 SP 可以避免内存混乱,因为无论如何都会重置控制器(我认为这是处理溢出的唯一方法)我希望不必介意状态在重置之前和“异常处理”之后的混乱堆栈。还是我忽略了一个错误?
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2016-02-19
相关资源
最近更新 更多