StackOverflowException甚至在增加堆栈大小之后

时间:2013-03-18 20:06:55

标签: c# visual-studio-2012

我有一个C#WinForm应用程序,我正在使用x86模式运行。它适用于x86模式。当我使用任何CPU模式运行此应用程序时,会出现此问题。我得到了下面提到的错误:

  

XXXXXX.dll中发生未处理的“System.StackOverflowException”类型异常

我知道这可能是由无限循环引起的,但在这种情况下,x86模式中应该发生相同的错误。我知道这不是因为无限次迭代。它与堆栈溢出有关。

经过一些研究后,我用Editbin增加了堆栈大小

  

Editbin.exe / Stack:14000000“$(TargetDir)MyProject.exe”

  

Editbin.exe / Stack:14000000“$(TargetDir)MyProject.exe”

任何想法可能是什么原因以及我应该进入哪个方向?

4 个答案:

答案 0 :(得分:37)

  

我的浴缸满溢。

尝试使用更大的浴缸。

  

好的,我做到了。我的浴缸还在溢出。

尝试使用更大的浴缸。

  

好的,它还在溢出!我有一个巨大的浴缸,但它仍然溢出!


如果问题是排水管堵塞且水龙头打开,那么更大的浴缸没有帮助。

您的问题很可能是您的程序正在尝试使用无限数量的堆栈。使堆栈更大也无济于事。

  

我知道这可能是因为无限循环而且在这种情况下x86模式中应该出现相同的错误。

这句话是错误的。不要求发生相同的错误。

  

为什么它会有所不同,具体取决于我是否针对特定的cpu?

抖动可以在不同的场景中生成不同的代码,有时可以生成将无限递归转换为无限循环的代码。那些不会消耗无限堆栈,但它们将永远运行。

  

假设为了参数,没有无界递归。

然后可能存在非常递归。由于64位代码可以比等效的32位代码增加更多的堆栈空间,因此大的递归可能导致更早的堆栈外错误。

在这种情况下,使堆栈更大是一个坏主意。相反,找到深度递归算法并将其转换为迭代算法。

答案 1 :(得分:7)

原因是无限递归。附加调试器并在发生异常时查看堆栈跟踪。

答案 2 :(得分:3)

您获得堆栈溢出的原因仅仅是因为您使用了太多的堆栈。

您只是在x64模式而不是x86模式下获取它的原因很可能是因为程序在x64模式下使用了更多的堆栈空间,因为引用会占用更多空间。你不能在x86模式下获得它只是运气,你根本就没有足够的堆栈空间来使它在这些特定情况下耗尽。

解决方案是找出程序中使用了如此多堆栈空间的内容。你应该寻找像运行太多级别的递归函数之类的东西。一个很好实现的递归函数会使用类似10或100级递归的东西,但如果你使用递归错误,你可能会有10000000级别的递归,这会占用大量的堆栈空间。

答案 3 :(得分:2)

您可以查看堆栈跟踪吗?

您可以阅读此属性:Environment.StackTrace。

如果堆栈跟踪超出您预设的特定阈值,则可以返回该功能。 您还可以尝试使用循环替换一些递归函数。 (如果.net 2.0及更高版本,则无法通过try-catch块捕获StackOverflowException对象)