2010-02-16 7 views
8

Was ist der beste Weg, um Speicherlecks in Apache httpd und httpd Module zu finden?Suche nach Speicherlecks in Apache httpd und Module

Gibt es irgendwelche Anleitungen?

I'v versuchte valgrind ein wenig, aber nur wenige Hindernisse erschienen:

  1. Valgrind für binäre normalerweise verlassen erwartet. Ich habe das mit MaxRequestsPerChild und -X Parameter geschafft.
  2. Valgrind berichtet über viele Sachen, wahrscheinlich verbunden mit apr-Pools, aber nichts nützliches.

OS: Linux

PS:

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

Valgrind Ausgabe Beispiel: http://paste-it.net/public/x5b6e8b/

Antwort

2

Ich weiß nicht, von einer magischen Kugel, aber Sie können werfen Sie einen Blick auf Valgrind/Valgrind.h, es hat einige nützliche Makros, um Dinge Valgrind bewusst zu machen und ihr Verhalten zu ändern vior wenn unter Valgrind läuft.

Zum Beispiel

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

Sie können auch, dass die ganze Durcheinander mit NDEBUG umhüllen, um es aus der Produktion aufbaut.

Das sollte Sie davor bewahren, jedes Mal, wenn Sie debuggen, mit dem Server herumhantieren zu müssen, es wird 'nur' machen, wenn Valgrind erkannt wird. RUNNING_ON_VALGRIND wird auf die Valgrind-Instanz erweitert oder bleibt 0, falls nicht zutreffend.

Für den Rest (und ich stelle mir vor, Sie bekommen eine Menge Lärm, höchstwahrscheinlich beginnend mit invalid read of size xx), können Sie systematisch unterdrücken anwenden. Wenn Sie einen Teil der Ausgabe veröffentlichen, ist es möglicherweise einfacher, Vorschläge für die Unterdrückungen zu machen, die Sie in einer Datei speichern können. Die Mailingliste des Valgrind-Benutzers ist extrem hilfreich und sehr tolerant. Sie können dort auch Ihren nervigsten und irrelevantesten Ton posten, Sie erhalten Antworten mit der Frage, wie Sie ihn schnell unterdrücken können.

Wenn alles, was Sie wollen, eine Zusammenfassung von Lecks und den Einstiegspunkten ist, die zu ihnen geführt haben, sollte es nicht zu schwierig sein, fast alles andere zu schließen.

+0

Ich habe Valgrind-Ausgabe hinzugefügt. Es gibt eine Menge Zeug, von denen einige aus meinem Modul stammen. –

0

Vielleicht ist es Zeit, den Code Refactoring, so dass Sie Tests außerhalb Apache laufen kann?

Wenn Sie Komponententests hinzufügen, die Codepfade überprüfen, die Speicher zuweisen, können Sie überprüfen, ob der gesamte Speicher freigegeben ist, indem Sie die Komponententests unter valgrind ausführen. Auf diese Weise müssen Sie sich nicht darum sorgen, dass der gesamte unter Apache ausgeführte Code nur eine geringe Anzahl von Transaktionen verarbeitet.Außerdem ist es einfacher, alle Codepfade mit Komponententests zu testen.

+0

Was meinst du? –