我们有一个.NET 4.0 WPF客户端应用程序,每天在数百台客户端PC /服务器上下载和执行。
我们最近有一位客户致电我们的支持热线并报告我们的一个例程错误。仔细研究后,我发现在执行我们的一个递归算法时,这台机器似乎更倾向于遇到StackOverflow异常。
如果具有完全相同的数据集的另一台机器可以通过30次递归迭代完成算法,那么在这台机器上它每次进展之前都会失败。
(1)某台机器(或OS配置)是否有可能遇到StackOverflow异常?为什么一台机器会在30次迭代之前失效而另一台机器会超越?是否有其他东西在"堆栈"?
中占用空间在可能相关的说明中,同一客户的错误日志中填充了"没有足够的配额可用于处理此命令"尝试点击按钮,打开对话框等时出现异常
(2)这两个错误是否可以指向一个共同的原因?
操作系统是Windows Server 2012。
更新: 我遇到了Why does a recursive call cause StackOverflow at different stack depths?,这看起来肯定会发生。我仍然无法确定哪个设置可能导致此问题。
答案 0 :(得分:3)
堆栈是一种有限的资源,您可能希望使用其特定数据集检查递归算法,以查看是否存在异常的递归深度问题。可能他们的一个记录有一个循环引用。
可用内存量与此无关。 .NET应用程序的默认堆栈大小为1MB。如果您怀疑自己只缺少一些并且没有循环引用,则可以使用EDITBIN.EXE(https://msdn.microsoft.com/en-us/library/d25ddyfc.aspx)来更改程序集的堆栈大小。
如果有内存配额,您需要查看为遇到此问题的特定用户实施该配置的组策略。可能的问题是服务器端的配置错误。