2010-02-16 13 views
8

¿Cuál es la mejor manera de encontrar fugas de memoria en los módulos httpd y httpd de Apache?Buscando fugas de memoria en Apache httpd y módulos

¿Hay algún howtos?

Me'v trató valgrind un poco, pero apareció pocos obstáculos:

  1. Valgrind se espera por binaria para salir normalmente. He logrado hacer eso con los parámetros MaxRequestsPerChild y -X.
  2. Valgrind informa sobre muchas cosas, probablemente relacionadas con grupos de apr, pero nada útil.

SO: Linux

PS:

Valgrind comando: $ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X

ejemplo de salida Valgrind: http://paste-it.net/public/x5b6e8b/

Respuesta

2

no sé de una bala mágica, pero puedo eche un vistazo a valgrind/valgrind.h, tiene algunas macros útiles para hacer que las cosas valen la pena y alterar su comportamiento vior si se ejecuta bajo Valgrind.

Por ejemplo

#ifndef HAVE_VALGRIND_VALGRIND_H 
#define RUNNING_ON_VALGRIND 0 
#else 
#include <valgrind/valgrind.h> 
#endif 

if (RUNNING_ON_VALGRIND) { 
    printf("Hello, this is Valgrind instance %d\n", RUNNING_ON_VALGRIND); 
    /* set debug output annoyingly high */ 
    /* exit after one request */ 
} 

También puede encerrar todo ese lío con NDEBUG para mantenerlo fuera de la producción se basa.

Eso debería evitar que tenga que juguetear con el servidor cada vez que depure, simplemente 'lo hará' si se detecta Valgrind. RUNNING_ON_VALGRIND se expandirá a la instancia valgrind, o permanecerá 0 si no es aplicable.

Para el resto (y me imagino que está recibiendo un montón de ruido, probablemente comenzando con invalid read of size xx), puede aplicar sistemáticamente supresiones. Si publica algo de la salida, podría ser más fácil hacer sugerencias para las supresiones que puede pegar en un archivo.

Por cierto, la lista de correo del usuario Valgrind es extremadamente útil y muy tolerante. También puede publicar su ruido más molesto e irrelevante allí, obtendrá respuestas con la forma de suprimirlo bastante rápido.

Si todo lo que quiere es un resumen de las fugas y los puntos de entrada que las condujeron, no debería ser demasiado difícil cerrar casi todo lo demás.

+0

He agregado la salida valgrind. Hay muchas cosas, algunas de las cuales son de mi módulo. –

0

Tal vez sea hora de refactorizar el código para que pueda ejecutar las pruebas fuera de Apache?

Si agrega pruebas unitarias que verifican las rutas de los códigos que asignan memoria, puede verificar que toda la memoria se libera, ejecutando las pruebas de unidad en valgrind. De esta manera, no tiene que preocuparse por hacer que el código completo que se ejecuta en apache maneje solo un pequeño número de transacciones.También será más fácil probar todas las rutas de código con pruebas unitarias.

+0

¿Qué quieres decir? –