2010-02-16 11 views
8

Qual è il modo migliore per trovare perdite di memoria nei moduli httpd e httpd di Apache?Ricerca di perdite di memoria in httpd e moduli Apache

Ci sono dei punti?

I'v cercato valgrind un po ', ma qualche ostacolo è apparso:

  1. Valgrind aspetta per binario per uscire normalmente. Sono riuscito a farlo con MaxRequestsPerChild e il parametro -X.
  2. Valgrind segnala molte cose, probabilmente connesse con le piscine apr, ma nulla di utile.

SO: Linux

PS:

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

esempio uscita Valgrind: http://paste-it.net/public/x5b6e8b/

risposta

2

non so di una bacchetta magica, ma ci riesco dai un'occhiata a valgrind/valgrind.h, ha alcune macro utili per rendere le cose di Valgrind consapevoli e alterare il loro comportamento viore se si corre sotto Valgrind.

Per esempio

#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 */ 
} 

È inoltre possibile racchiudere che tutto il casino con NDEBUG per tenerlo fuori produzione costruisce.

Questo dovrebbe farti evitare di dover armeggiare con il server ogni volta che esegui il debug, lo farà "basta" se Valgrind viene rilevato. RUNNING_ON_VALGRIND si espande all'istanza di valgrind o rimane 0 se non applicabile.

Per il resto (e sto immaginando di avere un sacco di rumore, molto probabilmente a partire da invalid read of size xx), è possibile applicare sistematicamente le soppressioni. Se pubblichi parte dell'output, potrebbe essere più semplice dare suggerimenti per le soppressioni che puoi incollare in un file.

Per inciso, mailing list dell'utente Valgrind è estremamente disponibile e molto tollerante. Puoi anche inviare il tuo rumore più fastidioso e irrilevante lì, riceverai risposte su come sopprimerlo piuttosto rapidamente.

Se quello che cercate è un riepilogo delle perdite e dei punti di ingresso che hanno portato a loro, non dovrebbe essere troppo difficile da arrestare quasi tutto il resto in su.

+0

Ho aggiunto l'output valgrind. Ci sono molte cose, alcune delle quali provengono dal mio modulo. –

0

Forse è il momento di refactoring del codice in modo che sia possibile eseguire i test al di fuori apache?

Se si aggiunge unit test che verificano percorsi di codice che allocano memoria, è possibile verificare che tutta la memoria viene liberata, eseguendo i test di unità sotto Valgrind. In questo modo non devi preoccuparti di eseguire il codice completo in esecuzione sotto apache gestire solo un piccolo numero di transazioni.Inoltre sarà più facile testare tutti i percorsi del codice con i test unitari.

+0

Cosa intendi? –