2012-06-18 16 views
8

Tengo un programa C++/Linux, que dentro de 2-3 segundos de ejecutarse comienza a escupir el error std::bad alloc en una RAM de 32GB (y se reinicia mediante la llamada envoltura). Lo que realmente me importa es resolver este problema, pero me gustaría ir paso a paso y aumentar mi confianza en mi comprensión del problema.obteniendo el error std :: bad_alloc; Cómo verificar de forma cruzada que el sistema operativo se está quedando sin memoria

Parece que el sistema no puede asignar memoria para una solicitud new (esto sucedería cuando el sistema operativo se ha quedado sin memoria). Mientras el programa se está ejecutando, en otro terminal ejecuto el comando sar con el menor intervalo posible (1 segundo), pero veo que kbcached tiene ~ 24GB de memoria. ¿Por qué el sistema operativo no puede liberar el almacenamiento en caché y hacer que esa memoria esté disponible para la solicitud new? O bien 1 segundo es demasiado tiempo (en comparación con la velocidad con la que se ejecutan los programas) o estoy haciendo algo mal aquí.

Básicamente me gustaría realizar una verificación cruzada y señalar que el sistema operativo se está quedando sin memoria y por lo tanto no puede asignar memoria, y luego tomar las cosas a partir de este punto. ¿Cómo hacerlo?

Idealmente, me gustaría tener las estadísticas del sistema justo en el momento en que la asignación de memoria falla, como la cantidad de almacenamiento en caché, la memoria total utilizada hasta etc.

+2

Solo una nota .. no tiene nada que ver con la cantidad de RAM que tiene, depende de la cantidad de memoria libre presente en el espacio de direcciones de la memoria virtual de proceso. No obstante, no conozco el comando para verificar el proceso de asignación de la memoria virtual. – Naveen

+0

Supongo que esto será específico del sistema operativo. – sharptooth

+0

¿Cuánta memoria asignó su proceso? ¿Qué restricciones tiene tu proceso? ¿Es de 32 bits? –

Respuesta

2

Si realmente quiere ver cómo se asigna la memoria de su proceso de , puede establecer un punto de interrupción con gdb para cuando se lanza la excepción. Cuando sea así, inspeccione el proceso con una herramienta como pmap, que puede mostrar información adicional sobre cómo el proceso utiliza la memoria.

Si eso es demasiado primitiva (y pronto habrá, pmap es bastante primitiva), valgrind incluye macizo y muchas otras utilidades para el diagnóstico de uso de memoria, uso de CPU, y otros problemas de tiempo de ejecución.

+1

Notablemente (en este caso), la herramienta valgrind macizo. Massif rastrea las asignaciones y permite obtener un gráfico del consumo de memoria en una línea de tiempo; y para cada instantánea, identifica de dónde provienen las asignaciones. –

+0

@MatthieuM. ¿Tal vez tu comentario debería ser una respuesta por sí mismo? – RedX

+1

@RedX: Nada más que decir, así que dejaré que Steven agregue los detalles a su propia respuesta si los encuentra valiosos. –

Cuestiones relacionadas