2009-05-28 17 views
5

Muchos C/C++/Fortran y otros programadores habrían encontrado errores de "desbordamiento de pila". Mi pregunta es, ¿hay alguna herramienta, un programa o un simple fragmento de código que nos permita monitorear o verificar el tamaño de la pila mientras el programa se está ejecutando? Esto puede ser útil para identificar dónde se acumula la pila y eventualmente causar un desbordamiento.¿Cómo prevenir un desbordamiento de pila al monitorear el tamaño de la pila?

Respuesta

1

No sé si hay un programa que lo haga por usted, pero puede verificar fácilmente dentro de una función donde está el puntero de la pila (al menos en C y C++). Solo mira la ubicación de la memoria de cualquier variable. No será la ubicación exacta, pero debería estar dentro de unos pocos bytes (lo que está bien para sus propósitos), ya que las variables locales se definen en la pila. Si quiere el valor exacto, puede obtenerlo a través del montaje, creo.

Sin embargo, podría ser más fácil simplemente mirar el rastro de la pila cuando el programa falla.

+0

y, si almacena la dirección de una variable local desde el marco de pila más bajo (main()) en una variable accesible globalmente, llámelo "g_my_stack_base" y luego puede verificar los tamaños de pila aproximados en cualquier función con approx_stack_size = my_local_function_variable - g_my_stack_base. Feo pero funciona Asegúrese de utilizar punteros char * para que la aritmética del puntero devuelva bytes. – tucuxi

1

Echa un vistazo a este question. La respuesta aceptada cita Raymond Chen:

If you have to ask, you're probably doing something wrong. 

Si usted definitivamente necesidad de hacerlo, entonces la solución/herramienta será dependiente de la plataforma. Un truco fácil es llenar la pila con un valor de bytes conocido (por ejemplo, AA) y controlar la posición del primer byte que no tiene este valor. Esto le dará el tamaño de pila máximo utilizado, no el tamaño de pila actual.

+0

Estoy de acuerdo. Por ejemplo, el sistema operativo DSP/BIOS llena una pila recientemente asignada con el patrón 0xDEADBEEF y la usa para rastrear el uso de la pila. Un método alternativo en un procesador x86 (no implementado fácilmente, tiene que ser hecho por el SO) sería poner la pila en un segmento separado. El sistema operativo puede configurar el descriptor de segmento a la longitud asignada para que un desbordamiento provoque un GPF, en cuyo punto el contenido de la pila se moverá hacia arriba y se extenderá. ¡Sin embargo, no estoy seguro si alguien realmente implementaría esto! –

Cuestiones relacionadas