28
C# Y EL STACK OVERFLOW
Filed Under (General) by PoliMalo on 28-12-2005
A los que llevamos ya algunos años trabajando en el mundillo del desarrollo de aplicaciones, términos como heap o stack nos son familiares.
Ahora que están de moda lenguajes de alto nivel como el C# o ActionScript, estos términos suenan difusos, como algo del pasado… y nada más lejos de la realidad.
Los que seáis de mi quinta (rondando la treintena) y tengáis los huevos pelaos de programar, seguro que habéis picado lineas de C y C++ por un tubo. Y como bien sabemos, el stack o pila es un tema que según en que entornos hay que tratar con delicadeza, sobre todo cuando echamos mano de la recursividad.
La recursividad en una poderosa técnica de programación que para los no iniciados, consiste en que una función se llame a si misma. Claros ejemplo de recursividad son el cálculo de un factorial, la serie de Fibonacci o el algoritmo de relleno FloodFill.
Que una función se llame a si misma conlleva un peligro y es que esta se quede llamándose a si misma más de lo esperado, provocando el temido Stack Overflow. En muchos casos, esto es debido a un mal diseño del algoritmo. Pero otras veces no…. necesitamos más memoria para la pila.
Si estamos programando en C o C++, esto no es excesivo problema, ya que en los settings de compilación y linkado podemos especificar memoria "extra" para la pila sin problemas.
El problema está, como en mi caso, si estamos utilizando C#.
¡¡¡No se puede cambiar el tamaño de la pila!!!
En concreto, tanto con el Runtime.NET 1.1 como el 2.0, el stack reservado para una aplicación es de algo menos de 512K's… una miseria. Un simple algoritmo de floodfill que tuviera que rellenar un área de 512×512 daría sistematicamente un StackOverflow a medio rellenar.
Aquí tenéis un simple fragmento de código en C#:
using System;
using System.Collections.Generic;
using System.Text;
// compilar con: /unsafe
namespace Recurse
{
class Program
{
static unsafe void Main(string[] args)
{
char* fib = stackalloc char[256*256*16];
}
}
}
Este simple programa realiza una reserva de 1024K's en la pila. Si compilamos y ejecutamos nos dará un StackOverflow.
Después de mucho buscar e investigar, para solucionar el problema tenemos esta solución:
Además del compilador de C#, necesitaremos el Visual C++ 7.0(.net) o superior (desconozco si esto sirve para la versión Express)
Con el Visual C viene una utilidad llamada editbin.exe. Una vez creado nuestro ejecutable (que da error), con esta aplicación le podremos cambiar el tamaño de la pila de la siguiente manera. Desde una consola tecleamos lo siguiente:
editbin /stack:4000000 Programa.exe
Con esta simple linea habremos puesto a disposición de nuestro programa casi 40Mb de Stack, con lo que podremos solucionar el problema.
A mi me ha salvado la vida…. pero no hubiera sido más fácil que microsoft hubiera puesto más settings en sus nuevos compiladores…. se ve que no.












