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

问题描述:

我们发现我们的一个自动生成的程序集在new()上抛出*Exception。这个类有(请随我)400个简单的属性被初始化(大部分是默认的(字符串)等)在构造函数中。如何更改托管executable.net的默认堆栈大小

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

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

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

堆栈溢出的重要原因。我们已经缩小了相关构造函数的错误。我的第一印象也是无限递归的类型。然而,我们使用3线控制台应用程序再现了错误:

  • 创建类的空实例。
  • 在第一份工作要创建的类上调用一个非静态方法(克隆),并且清空实例已准备好将这些属性传入。

它碰到第二个构造函数时会发生爆炸。

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

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

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

+1

好的,所以我投了票,没有看到在http://*.com/questions/1042347/how-do-you-change-default-stack-size-for-managed-executable上的建议重复。对于那个很抱歉。既然这一个实际上已经得到了回答,而另一个则没有,我认为我们应该让这个开放并关闭另一个。 – 2009-06-25 05:58:41

+0

哎呀复制是一个浏览器口吃的情况下真正点击回想我想添加更多的信息 - 但显然它张贴。 – 2009-06-25 09:32:15

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

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

我会感到惊讶,如果只设置在构造400点的属性是虽然问题的原因......这将是一个堆栈帧 - 但除非你有几个堆栈帧在堆栈上,我预计它会好起来的。另一种可能是,你有什么地方无限递归:)

编辑:另外一个建议......

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

如果您可以告诉我们构造函数是什么样子,那会有很大的帮助。您可能还想使用ildasm来查看它声明该构造函数的堆栈大小。

只是为了检查,这一个类而不是结构,对吧?