c# - 防止堆栈溢出异常导致进程崩溃

标签 c# stack-overflow applicationdomain

假设我有一个应用程序,用户可以在其中提供用 JavaScript 编写的脚本来执行其中的某些任务。这是使用 Jint 完成的。但是,编写不当的脚本可能会在 JintEngine.Run() 中导致堆栈溢出异常,从而导致整个应用程序崩溃。我宁愿通知用户脚本中的错误。

我尝试在另一个应用程序域上运行 Jint,但没有帮助,因为 AFAIK 对 SOE 的默认操作正在退出进程。是否可以通过使用 CLR 托管以外的任何其他方式对其进行更改?

我知道我可以运行单独的进程,这是我的后备方案,但我不想那样做。

最佳答案

正如您所怀疑的,除非您自己托管 CLR [1],否则不可能捕获运行时生成的 StackOverflowException。正如 Microsoft 文档所建议的那样,最好的办法是尝试在堆栈溢出发生之前对其进行检测。

在使用 Jint 的情况下,这意味着找到一些方法来 Hook 执行引擎并将您自己的代码附加到任意方法调用。幸运的是,他们的文档的简要概述表明他们有一个 Debug模式可以做到这一点! [2]

毫无疑问,在 Debug模式下运行会减慢脚本的执行速度;由您来决定检测溢出的好处是否值得付出代价——我绝对建议衡量这种惩罚以确保它确实会成为一个问题。一种可能的缓解措施是允许用户选择何时激活 Debug模式。

-标记

[1] http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx (见备注)

[2] http://jint.codeplex.com/wikipage?title=Debugging&referringTitle=Documentation

关于c# - 防止堆栈溢出异常导致进程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4950983/

相关文章:

c# - 尝试创建实例应用程序域

c# - LINQ 到 XML : Collapse mutliple levels to single list

c# - 通过配置使用验证应用程序 block 时未调用自定义验证器

c# - 在输入编辑框之前如何拦截键盘输入?

c# - 如何从 jwt token 中获取 "exp"并与当前时间进行比较以检查 token 是否已过期

javascript - node.js/Express在高负载下抛出 'RangeError: Maximum call stack size exceeded'

java - 使用递归(java)查找给定数字是否是给定集合(允许重复)的总和

java - 如何在 Java Spring MVC 创建时将大量数据作为文件提供?

c# - 应用程序域和线程

actionscript-3 - RSL、LoaderContext 和 ApplicationDomain。我可以将应用程序域传递给 RSL 吗?