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
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.
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.
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! –
- 1. Prevenir el desbordamiento de pila Excepción del proceso de bloqueo
- 2. Establezca el tamaño de la pila con setrlimit() y provoque un desbordamiento de la pila/segfault
- 3. C++ desbordamiento de pila
- 4. Extraño desbordamiento de pila?
- 5. Ejecutando un error de "desbordamiento de pila"
- 6. Tamaño de la pila restante hasta que se produce un desbordamiento de pila
- 7. Desbordamiento de pila
- 8. ¿Cómo puedo prevenir o recuperar un desbordamiento de pila en un subproceso de trabajador?
- 9. Error de desbordamiento de la pila de Java: ¿cómo aumentar el tamaño de la pila en Eclipse?
- 10. Agregar un botón personalizado al editor WMD (Desbordamiento de pila)
- 11. ¿Integra el desbordamiento de pila en IDEs?
- 12. ¿Cómo puedo aumentar el tamaño de la pila en Python?
- 13. ¿Qué es un desbordamiento de pila?
- 14. Desbordamiento de pila al utilizar el modelo System.Net.Sockets.Socket.AcceptAsync
- 15. El patrón Java causa desbordamiento de pila
- 16. desbordamiento de pila misterioso en el constructor
- 17. ¿Cómo evitar el desbordamiento de pila en Haskell?
- 18. Desbordamiento de pila en la línea 0
- 19. -Xms: ¿tamaño de pila inicial o tamaño de pila mínimo?
- 20. ¿Aumenta el tamaño de la pila al compilar con mingw?
- 21. Cómo controlar o evitar un desbordamiento de pila en C++
- 22. Explotación de desbordamiento de pila en C
- 23. Formato de desbordamiento de pila para Wordpress
- 24. AppDomain.FirstChanceException y excepción de desbordamiento de pila
- 25. Estimación del tamaño de pila
- 26. ¿Cómo rebosar la pila sin empujar nuevos marcos de pila?
- 27. Arquitectura web de desbordamiento de pila
- 28. Función recursiva que causa un desbordamiento de la pila
- 29. Excepción de desbordamiento de pila: ¿por qué?
- 30. excepción de desbordamiento de pila en el programa tonta
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