如何更改托管的executable.net的默认堆栈大小

时间:2009-06-25 05:43:25

标签: .net stack default stack-overflow

我们发现我们的一个自动生成的程序集在new()上抛出了StackOverflowException。这个类有(请加上我)在构造函数中初始化的400多个简单属性(大多数是默认(字符串)等)。

我们注意到它在64位上很好,但在32位上却很棒!

我们需要测试我们的用例是否合理创建一个更大的默认堆栈,以便在我们重新设计代码生成器时为我们提供喘息空间。

我们特别想要。如果可能,对涉及app.config的解决方案感兴趣。但我是一个现实主义者,所以一切都会好。

重置堆栈溢出的原因。我们已经缩小了有问题的构造函数的错误。我的第一印象也是无限递归的类型。但是,我们使用3行控制台应用程序重现了错误:

  • 创建一个空的类实例。
  • 在第一个作业要创建的类上调用非静态方法(Clone),并将空实例准备好传递给属性。

它击中第二个构造函数时会发出砰的一声。

现在使用.net源代码调试我们看到堆栈溢出在Guid.NewGuid()中,它作为第二个参数传递给构造函数。实际的代码行是对本机CoCreateGuid()调用的调用。

因此虽然它可能是CoCreateGuid()中的错误,但我们希望从问题中消除我们的代码。我的第一个想法是大量增加堆栈的大小,并查看是否再次出现此错误。然后,因为我认为我们可以控制所有用例,用对象初始化替换构造函数 - 认为这可以减轻堆栈上的压力。

铌。我们可以通过从类中删除int属性来阻止错误发生。

1 个答案:

答案 0 :(得分:2)

您可以use editbin更改可执行文件的堆栈大小。据我所知,您无法在app.config中执行此操作。

另一个选项(在该页面上也提到)是创建一个具有“正确”堆栈大小的新线程。该页面提到了这种方法的优缺点。

如果只是在构造函数中设置400个属性是导致问题的原因我会感到惊讶......那将是一个大堆栈框架 - 但除非你有堆栈上的几个大堆栈帧,我希望它没关系。另一种可能性是你在某处有无尽的递归:)

编辑:另一种建议......

据推测,这个构造函数中有很多局部变量? (否则它不应该占用任何其他调用的堆栈。)是否可以将构造函数拆分为多个方法,设置(比方说)每个方法20个字段?如果这些字段是只读的,那将是棘手的。

如果您可以让我们了解构造函数的外观,那将会有很大帮助。您可能还想使用ildasm来查看它声称该构造函数的堆栈大小。

要检查一下,这个一个类而不是一个结构,对吗?