2008-09-20 10 views
22

Mi aplicación C utiliza 3 bibliotecas, que hacen su propia gestión de memoria. Para ser robusto, mi aplicación tiene un código para tratar las fallas de las funciones de la biblioteca debido a la falta de memoria libre.Cómo simular los errores de asignación de memoria

Me gustaría probar este código, y para esto, necesito simular fallas debido a la falta de memoria.

¿Qué herramienta/s se recomiendan para esto? Mi entorno es Linux/gcc.

+0

Véase también http://stackoverflow.com/questions/1229241/how-do-i-force-a-program-to-appear-to-run-out-of-memory/1232235 –

Respuesta

13

Crea tu propia envoltura malloc que devolverá aleatoriamente null en lugar de un puntero válido. Bueno, o que falla constantemente si quieres una prueba unitaria.

+0

Y también 'calloc' , 'realloc',' strdup', y cualquier otra función de asignación de memoria que use el código. Y desearía una forma de desactivar esta característica cuando compile para un lanzamiento. –

4

Puede escribir su propia biblioteca de prueba con la misma interfaz que su biblioteca de terceros en lugar de hacerlo. También puede usar LD_PRELOAD para anular las funciones seleccionadas de la biblioteca de terceros.

3

Puedo dar una versión específica de Linux (tal vez POSIX): __malloc_hook, __realloc_hook, __free_hook. Estos están declarados en malloc.h.

EDITAR: Un poco de elaboración: estos son indicadores de función (ver malloc.hy su página de manual para la declaración exacta), pero cuidado: estos no son exactamente estándares, solo extensiones de GNU. Entonces, si la portabilidad es un problema, no use esto.

Una solución un poco menos dependiente de la plataforma podría ser que usted declare una macro malloc. Si estás probando, esto llama un gancho y el malloc real.

memhook.h:

#define malloc(s) (my_malloc(s)) 

memhook.c:

#include "memhook.h" 
#undef malloc 
#include <stdlib.h> 

etc.

Usted puede usar esto para detectar fugas, al azar fallar la asignación, etc.

+1

Una macro malloc no ayudaría a simular fallas dentro de bibliotecas de terceros; ya están compiladas con llamadas al malloc original. LD_PRELOAD ayudaría, sin embargo. –

22

Puede usar ulimit para limitar la cantidad de recursos que un usuario puede usar, incluida la memoria. Así se crea un usuario de prueba, limitan su uso a la memoria algo que sólo lo suficiente para poner en marcha su programa, y ​​ver morir :)

Ejemplo:

ulimit -m 64 

establece un límite de memoria de 64 kb.

0

Desea el comando ulimit en bash. Pruebe

help ulimit
en el indicador bash shell.

+0

No soy el arma más rápida en el oeste. O incluso el esat, parecería. – jfm3

1

Además, se debe utilizar Valgrind para probar todo y obtener informes de bienes útiles sobre el comportamiento de la memoria de su programa

+1

El subtool se llama macizo. el macizo es un generador de perfiles de montón. Mide la cantidad de memoria que utiliza tu programa. Generará un registro y un gráfico postscript (.ps). –

0

(Como complemento a algunas de las respuestas anteriores)

Pedido "Electric Fence" para un ejemplo de una biblioteca de interceptación de malloc que puede usar con su ejecutable (usando el truco LD_PRELOAD, por ejemplo).

Una vez que haya interceptado malloc, puede usar lo que quiera para desencadenar fallas. Un error desencadenado aleatoriamente sería una buena prueba de estrés para las diversas partes del sistema.También puede modificar la probabilidad de falla en función de la cantidad de memoria solicitada.

Suyo es una idea interesante, por cierto, claramente algo que me gustaría hacer en algunos de mi código ...

7

En los sistemas operativos que overcommit memoria (por ejemplo, Linux o Windows), se simplemente no es posible manejar errores de falta de memoria. malloc puede devolver un puntero válido y, más adelante, cuando intenta desreferenciarlo, su sistema operativo puede determinar que se ha quedado sin memoria y matar el proceso.

http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/ es una buena reseña sobre esto.

+0

Este comportamiento ha causado un grave dolor en mi proyecto recientemente. hombre malloc y mira debajo del encabezado BUGS. echo/proc/sys/vm/overcommit_memory Si es 2, el exceso de compromiso está desactivado. –

+0

Esta respuesta es simplemente incorrecta. Overcommit se desactiva fácilmente, y otros factores como 'ulimit' o el agotamiento de todo el espacio de direcciones virtuales también pueden provocar fallas de asignación. –

+0

Por cierto, su enlace conduce a una gema: http://lwn.net/Articles/104185/ –

0

Es posible que desee consultar algunos de los sitios de computación orientados a la recuperación, como el Berkeley/Stanford ROC group. He oído hablar a algunas de estas personas antes, y usan el código para inyectar errores aleatoriamente en el tiempo de ejecución de C. Hay un enlace a su herramienta FIT en la parte inferior de su página.

+0

Parece que el nombre de la herramienta es FIG, no FIT. –