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

Amr*_*rka 6 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"

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

Eri*_*ert 37

我的浴缸满溢了.

尝试更大的浴缸.

好的,我做到了.我的浴缸还在满溢.

尝试更大的浴缸.

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


如果问题是排水管堵塞并且水龙头打开,那么更大的浴缸也无济于事.

您的问题可能是您的程序试图消耗无限量的堆栈.使堆栈更大也无济于事.

我知道这可能是因为无限循环而且在这种情况下x86模式中应该发生同样的错误.

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

根据我是否针对特定的cpu,它为什么会有所不同?

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

假设为了论证,没有无限递归.

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

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


ale*_*lex 7

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

  • @Guffa:不,我说它可能是一个无限递归*尽管它在x86中没有崩溃的事实.每当你看到一个堆栈外,它很可能是一个无限的递归.它不会责备一直告诉我很少; 我们已经知道该程序是错误的.片状复制品可能是由于百万因素中的任何一个因素造成的. (4认同)
  • @Guffa:我的观点是*我们不知道问题的原因是什么*.一个合理的假设,因为提供的证据很少,在某些代码路径上存在无限递归.有一些极其微弱的证据*反对*这个假设; 我们不应该把这些弱证据视为强有力的证据.有很多方法可以进行无限递归; 事实上,在某些情况下它并不是一贯地重复,这并不足以证明这一假设是不可取的. (2认同)