Pregunta

Hemos descubierto que uno de nuestros ensamblados generados automáticamente está lanzando una StackOverflowException en new (). Esta clase tiene (tenga paciencia conmigo) más de 400 propiedades simples que se inicializan (la mayoría por defecto (cadena), etc.) en un constructor.

¡Notamos que está bien en 64 bits pero en 32 bits se vuelve loco!

Necesitamos probar si es razonable para nuestro caso de uso crear una pila predeterminada más grande para darnos un respiro mientras rediseñamos el generador de código.

Nos gustaría esp. interesado en soluciones que involucren app.config si es posible. Pero soy realista, así que cualquier cosa sería buena.

Razones para el flujo excesivo de la pila. Hemos reducido el error al constructor en cuestión. Mis primeras impresiones también fueron del tipo de recursión infinita. Sin embargo, hemos reproducido el error usando una aplicación de consola de 3 líneas que:

  • crea una instancia vacía de clase.
  • llama a un método no estático (Clone) en la clase cuyo primer trabajo es crear y vaciar la instancia lista para pasar las propiedades.

Se dispara cuando golpea al segundo constructor.

ahora depurando con el código fuente .net vemos que el desbordamiento de la pila está en Guid.NewGuid (), que se pasa como el segundo parámetro al constructor. La línea de código real es la llamada a la llamada CoCreateGuid () nativa.

Entonces, aunque podría ser un error en CoCreateGuid (), queremos eliminar nuestro código del problema. Mi primer pensamiento es aumentar el tamaño de la pila de forma masiva y ver si este error se repite. Entonces, dado que creo que podemos controlar todos los casos de uso, es reemplazar el constructor con la inicialización del objeto: creo que esto puede aliviar la presión sobre la pila.

Nb. Podemos evitar que ocurra el error eliminando solo la propiedad int de la clase.

¿Fue útil?

Solución

Puede use editbin para cambiar el tamaño de la pila del ejecutable. No puede hacer esto en app.config hasta donde yo sé.

Otra opción (también mencionada en esa página) es crear un nuevo hilo con el " derecho " tamaño de la pila. La página menciona los pros y los contras de este enfoque.

Me sorprendería si solo configurar 400 propiedades en un constructor fue la causa del problema ... eso será one marco de pila grande, pero a menos que tenga varios marcos de pila grandes en la pila, esperaría que esté bien. La otra posibilidad es que tengas una recursión interminable en alguna parte :)

EDITAR: una sugerencia alternativa ...

¿Presumiblemente tiene muchas variables locales en este constructor? (De lo contrario, no debería ocupar más pila que cualquier otra llamada). ¿Es posible dividir el constructor en varios métodos, configurando (por ejemplo) 20 campos por método? Eso será complicado si los campos son de solo lectura, ciertamente.

Si pudiera darnos una idea de cómo se ve el constructor, eso ayudaría mucho. También es posible que desee utilizar ildasm para ver cuál dice que será el tamaño de la pila para ese constructor.

Solo para verificar, este es una clase en lugar de una estructura, ¿verdad?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top