2009-12-17 8 views
5

Estoy depurando un programa que falla durante una situación de memoria baja y me gustaría un programa C++ que simplemente consume MUCHA memoria. ¡Cualquier apuntador ayudaría!Simulando poca memoria usando C++

+17

"Cualquier indicador ayudarían!" - Eso es gracioso teniendo en cuenta la pregunta – KeatsPeeks

+0

Sugiero Photoshop ... heh. – Aaron

+13

0x3A28213A 0x6339392C 0x7363682E –

Respuesta

7

Allcoating big blocks no va a funcionar.

  • Dependiendo del sistema operativo, no está limitado a la memoria física real y los fragmentos grandes no utilizados podrían intercambiarse al disco.
  • También esto hace que sea muy difícil hacer que su memoria falle exactamente cuando quiere que falle.

Lo que necesita hacer es escribir su propia versión del comando new/delete that fail on.

algo como esto:

#include <memory> 
#include <iostream> 



int memoryAllocFail = false; 

void* operator new(std::size_t size) 
{ 
    std::cout << "New Called\n"; 
    if (memoryAllocFail) 
    { throw std::bad_alloc(); 
    } 

    return ::malloc(size); 
} 

void operator delete(void* block) 
{ 
    ::free(block); 
} 

int main() 
{ 
    std::auto_ptr<int> data1(new int(5)); 

    memoryAllocFail = true; 
    try 
    { 
     std::auto_ptr<int> data2(new int(5)); 
    } 
    catch(std::exception const& e) 
    { 
     std::cout << "Exception: " << e.what() << "\n"; 
    } 
} 
> g++ mem.cpp 
> ./a.exe 
New Called 
New Called 
Exception: St9bad_alloc 
+1

Es posible que el simple enlace de una versión de reemplazo de malloc() que devuelve nulo a petición proporcione una mejor cobertura (o tal vez ambos en caso de que el nuevo incorporado no use malloc()) de modo que si algún código utiliza malloc () fallará al mismo tiempo y, si se usa nuevo (nothrow), seguirá fallando. – Clifford

+0

No es un requisito de new/delete usar malloc/free. Por lo tanto, deberá verificar su documentación de implementación para ver cómo funciona bajo el capó. Consulte http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free/240308#240308 para obtener más información –

+0

Vinculación en una nueva versión con la versión especial de malloc/free puede ser problomático pero no es imponible. Pero, técnicamente, el estándar no admite ese tipo de comportamiento (aunque las herramientas comerciales hacen exactamente eso (pero tienen equipos de desarrollo trabajando en el problema)). –

2

sé que es una fuga, pero punteros le ayudará :)

int main() 
{ 
    for(;;) 
    { 
     char *p = new char[1024*1024]; 
    } 
    // optimistic return :) 
    return 0; 
} 
+0

La asignación de trozos grandes eventualmente fallará. Pero no ayuda a hacerlo fallar de una manera controlada. Además, el sistema operativo cambiará las páginas al disco, ya que no está limitado por los límites físicos de RAM. –

12

¿Estás en la plataforma Windows (mirando el nombre de usuario ... quizá no :)) Si se encuentra en la tierra de Windows , AppVerifier tiene un modo de simulación de memoria baja. Vea la prueba de simulación de bajo recurso.

+0

+1 No he usado AppVerifier en sí, pero algo así es una idea mucho mejor. No desea que todo en su sistema sufra (¡como su depurador!) En su situación de miembro bajo. – luke

3

Sólo tiene que escribir una aplicación C++ que crea una matriz gigante

+1

Es posible que necesite deshabilitar el administrador de memoria virtual (limite el sistema operativo a solo usar la memoria física). Incluso podría ir tan lejos como para eliminar algo de RAM de su sistema, para acelerar el punto en el que tiene poca memoria RAM. – Mordachai

+0

El problema aquí se vuelve difícil escribir pruebas que fallan consistentemente en cualquier entorno. –

9

Si está utilizando Unix o Linux, me gustaría sugerir el uso de ulimit: se le pidió

bash$ ulimit -a 
core file size  (blocks, -c) unlimited 
data seg size   (kbytes, -d) unlimited 
... 
stack size   (kbytes, -s) 10240 
... 
virtual memory  (kbytes, -v) unlimited 
Cuestiones relacionadas