gpt4 book ai didi

.net - 您如何更改托管可执行文件的默认堆栈大小.net

转载 作者:行者123 更新时间:2023-12-01 04:22:01 24 4
gpt4 key购买 nike

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

我们注意到它在 64 位上很好,但在 32 位上它会爆炸!

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

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

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

  • 创建一个空的类实例。
  • 在第一个工作是创建和清空实例的类上调用一个非静态方法(克隆),准备将属性传递给它。

  • 当它击中第二个构造函数时,它会爆炸。

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

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

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

    最佳答案

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

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

    如果只是在构造函数中设置 400 个属性是问题的原因,我会感到惊讶……这将是一个大堆栈框架 - 但除非堆栈中有几个大堆栈框架,否则我会期待它没事。另一种可能性是你在某处有无限的递归:)

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

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

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

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

    关于.net - 您如何更改托管可执行文件的默认堆栈大小.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1042345/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com