我们发现我们的一个自动生成的程序集在new()时抛出了StackOverflowException异常。这个类有400多个简单属性,在构造函数中初始化(大多数为默认值(string)等)。
我们注意到它在64位上很好,但在32位上会出问题!
我们需要测试是否合理为我们的用例创建一个更大的默认堆栈,以便在重新设计代码生成器时给我们留出余地。
如果可能,我们尤其希望使用app.config的解决方案。但我是现实主义者,所以任何东西都可以。
关于堆栈溢出的原因。我们已经将错误缩小到了相关的构造函数。我的第一印象也是无限递归的类型。然而,我们使用一个3行的控制台应用程序重现了这个错误:
创建一个类的空实例。 调用类上的非静态方法(Clone),它的第一项工作是创建一个空实例,准备将属性传递给它。 当它达到第二个构造函数时就会失败。
现在使用.net源代码进行调试,我们看到堆栈溢出在Guid.NewGuid()中,它被作为第二个参数传递给构造函数。实际的代码行是调用本地的CoCreateGuid()调用。
因此,虽然这可能是CoCreateGuid()中的一个错误,但我们想排除我们的代码问题。我的第一个想法是大幅增加堆栈的大小,看看这个错误是否会再次发生。然后,由于我认为我们可以控制所有用例,就将构造函数替换为对象初始化——我认为这可以减轻对堆栈的压力。
注意:我们可以通过从类中删除一个int属性来防止错误发生。
我们注意到它在64位上很好,但在32位上会出问题!
我们需要测试是否合理为我们的用例创建一个更大的默认堆栈,以便在重新设计代码生成器时给我们留出余地。
如果可能,我们尤其希望使用app.config的解决方案。但我是现实主义者,所以任何东西都可以。
关于堆栈溢出的原因。我们已经将错误缩小到了相关的构造函数。我的第一印象也是无限递归的类型。然而,我们使用一个3行的控制台应用程序重现了这个错误:
创建一个类的空实例。 调用类上的非静态方法(Clone),它的第一项工作是创建一个空实例,准备将属性传递给它。 当它达到第二个构造函数时就会失败。
现在使用.net源代码进行调试,我们看到堆栈溢出在Guid.NewGuid()中,它被作为第二个参数传递给构造函数。实际的代码行是调用本地的CoCreateGuid()调用。
因此,虽然这可能是CoCreateGuid()中的一个错误,但我们想排除我们的代码问题。我的第一个想法是大幅增加堆栈的大小,看看这个错误是否会再次发生。然后,由于我认为我们可以控制所有用例,就将构造函数替换为对象初始化——我认为这可以减轻对堆栈的压力。
注意:我们可以通过从类中删除一个int属性来防止错误发生。